Группа "Стол заказов MQL"

Рейтинг 2146



РЕКОМЕНДУЮ



Написание советника, с поиском поручителя

Добрый день, Андрей, а также посетители сайта.
Сначало просьба к вам выступить поручителем! За ранее спасибо, кто согласиться!
Андрей, возможно реализовать советник работающий по принципу:
Советник открывает два отложенных стоповых ордеров на равном расстоянии от цены равными лотами. (Расстояние задаётся в параметрах советника — step). После того как сработает один из ордеров второй удаляется. И уже от рыночного ордера на расстоянии step будет установлен один противоположный открытому ордеру стоповый ордер только уже удвоенным лотом! И т.д. если сработал противоположный стоповый ордер то на расстоянии step от рыночного ордера снова устанавливается противоположный стоповый ордер. Лот ордеров — первый указываем в настройках, последующие лоты фиксированные но увеличены в два раза от первоначального.
Закрытие ордеров происходит по общему профиту. После закрытия все ордеров советник все начинает сначала!
Спасибо всем за помощь и содействие!
  • +2
  • Просмотров: 4385
  • 10 ноября 2017, 16:56
  • PetrovMaxim
Понравилcя материал? Не забудьте поставить плюс и поделиться в социальной сети!

Вступите в группу "Стол заказов MQL", чтобы следить за обновлениями
ПРИСОЕДИНИТЬСЯ К ГРУППЕ
присоединиться
  Предыдущая запись в группе
Изменение уровней в индикаторе DOT.MMS для МТ4
Следующая запись в группе  
Советник по заданному направлению
10 ноября 2017
10 ноября 2017

Брокер для ваших роботов, 15 лет на рынке

Комментарии (16)

+
0
Если Андрей возьмется, готов взять на мой ник заказ.
avatar

  13  Pesha Сообщений: 222 - ¯\_(ツ)_/¯

  • 11 ноября 2017, 14:27
+
0
Спасибо!
avatar

  7  PetrovMaxim Автор Сообщений: 119 - Максим

  • 11 ноября 2017, 14:30
+
0
После выходных.
avatar

  35  AM2 Сообщений: 16250 - Андрей

  • 11 ноября 2017, 14:45
+
0
Подробно все на скринах покажите?
avatar

  35  AM2 Сообщений: 16250 - Андрей

  • 12 ноября 2017, 17:19
+
0
Андрей, я думаю не особо получится!

При запуске советника открываются два стоповых ордеров равным лотом (Лот 1) и на одинаковом расстоянии от цены (step).

Если сработал ордер buy stop то второй стоповый ордер удалился. и уже от открытого ордера Buy на расстояние (step) откладывается ордер sell stop следующим лотом (Лот 2), если цена развернулась и пошла в сторону ордера sell stop и от сработал, то снова на расстоянии step уже от ордера sell устанавливается ордер Buy stop лотом 2 и. т.д.

В противоположную сторону все тоже самое если сработает первым sell stop
Закрытие ордеров происходит по общему профиту.
Настройки советника
Лот первый (Лот 1)
Лот последующих ордеров (Лот 2)
Расстояние от цены (Step)
Общий профит
avatar

  7  PetrovMaxim Автор Сообщений: 119 - Максим

  • 12 ноября 2017, 20:05
+
0
Замудреный алгоритм. Сейчас если получится быстро сделать, то будет советник :) 
avatar

  35  AM2 Сообщений: 16250 - Андрей

  • 12 ноября 2017, 21:44
+
0
Спасибо, Андрей!
avatar

  7  PetrovMaxim Автор Сообщений: 119 - Максим

  • 12 ноября 2017, 21:51
+
0
Это же Hedge Martin! Здесь достаточно реализаций и со стоповыми и рыночными ордерами, смотрите в базе.

А это тот набросок который я успел сделать пока допетрил! :D 




//+------------------------------------------------------------------+
//|                                                       Petrov.mq4 |
//|                                              Copyright 2017, AM2 |
//|                                      http://www.forexsyatems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, AM2"
#property link      "http://www.forexsyatems.biz"
#property version   "1.00"
#property strict

//--- Inputs
extern double Lots       = 0.1;      // лот
extern int StopLoss      = 2000;     // лось
extern int TakeProfit    = 3000;     // язь
extern int Step          = 200;      // расстояние для отложек
extern int Slip          = 0;        // реквот
extern int Shift         = 1;        // на каком баре сигнал 
extern int Magic         = 123;      // магик
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   Comment("");
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void PutOrder(int type,double price)
  {
   int r=0;
   color clr=Green;
   double sl=0,tp=0;

   if(type==1 || type==3 || type==5)
     {
      clr=Red;
      if(StopLoss>0) sl=NormalizeDouble(price+StopLoss*Point,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price-TakeProfit*Point,Digits);
     }

   if(type==0 || type==2 || type==4)
     {
      clr=Blue;
      if(StopLoss>0) sl=NormalizeDouble(price-StopLoss*Point,Digits);
      if(TakeProfit>0) tp=NormalizeDouble(price+TakeProfit*Point,Digits);
     }

   r=OrderSend(NULL,type,Lots,NormalizeDouble(price,Digits),Slip,sl,tp,"",Magic,0,clr);
   return;
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountTrades()
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()<2) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
  {
   bool cl;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==0 && (ot==0 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slip,White);
              }
            if(OrderType()==1 && (ot==1 || ot==-1))
              {
               RefreshRates();
               cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slip,White);
              }
           }
        }
     }
  }
//+------------------------------------------------------------------+
//| Подсчет ордеров по типу                                          |
//+------------------------------------------------------------------+
int CountOrders(int type)
  {
   int count=0;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==type) count++;
           }
        }
     }
   return(count);
  }
//+------------------------------------------------------------------+
//| Удаление отложенных ордеров                                      |
//+------------------------------------------------------------------+
void DelOrder()
  {
   bool del;
   for(int i=OrdersTotal()-1;i>=0;i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()>1) del=OrderDelete(OrderTicket());
           }
        }
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double LastOrderPrice()
  {
   double pr=0;

   if(OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES))
     {
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
        {
         if(OrderType()<2) pr=OrderOpenPrice();
        }
     }
   return(pr);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int LastOrderType()
  {
   int ot=8;

   if(OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES))
     {
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
        {
         if(OrderType()<2) ot=OrderType();
        }
     }
   return(ot);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double LastOrderLot()
  {
   double lt=0;

   if(OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES))
     {
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
        {
         if(OrderType()<2) lt=OrderLots();
        }
     }
   return(lt);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
bool Proverka(int type,double pr)
  {
   if(OrderSelect(OrdersTotal()-1,SELECT_BY_POS,MODE_TRADES))
     {
      if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
        {
         if(type==0 && OrderType()>1 && OrderOpenPrice()==NormalizeDouble(pr-Step*Point,_Digits)) return(true);
         if(type==1 && OrderType()>1 && OrderOpenPrice()==NormalizeDouble(pr+Step*Point,_Digits)) return(true);
        }
     }
   return(false);
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
   if(CountTrades()<1)
     {
      if(CountOrders(4)<1) PutOrder(4,Bid+Step*Point);
      if(CountOrders(5)<1) PutOrder(5,Bid-Step*Point);
     }

   if(CountTrades()>0)
     {
      DelOrder();
     }

   if(CountTrades()>0)
     {
      if(CountOrders(4)<1 && LastOrderType()==0) PutOrder(5,LastOrderPrice()-Step*Point);
      if(CountOrders(5)<1 && LastOrderType()==1) PutOrder(4,LastOrderPrice()+Step*Point);
     }

   Comment("\n Order Price: ",LastOrderPrice(),
           "\n Order Type: ",LastOrderType(),
           "\n Order Lot: ",LastOrderLot(),
           "\n Proverka: ",Proverka(LastOrderType(),LastOrderPrice()));
  }
//+------------------------------------------------------------------+



avatar

  35  AM2 Сообщений: 16250 - Андрей

  • 12 ноября 2017, 22:31
+
+2
Так и быть доделал то что начал :)  www.opentraders.ru/downloads/1722/



avatar

  35  AM2 Сообщений: 16250 - Андрей

  • 12 ноября 2017, 23:00
+
0
Андрей, спасибо:) 
avatar

  7  PetrovMaxim Автор Сообщений: 119 - Максим

  • 13 ноября 2017, 06:56
+
0
я думаю, если сделать, чтобы ордера открывались по краям уровней спроса и предложения, то риск слива депо уменьшится. Как вы думаете?
avatar

  14  Dim777777 Сообщений: 320 - Дмитрий

  • 13 ноября 2017, 11:33
+
0
Андрей, спасибо, все работает как надо, только в советника мартин, а хотелось бы чтобы первые стоповые ордера открывались допустим лотом 1, после того как сработает один из первых стоповых ордеров все последующие отложенные ордера открывались допустим только лотом 2, пока все не закроется по общему профиту, после чего снова открываются два отложенные ордера первоначальным лотом.
avatar

  7  PetrovMaxim Автор Сообщений: 119 - Максим

  • 13 ноября 2017, 21:12
+
0
Это уже в следующем топике.
avatar

  35  AM2 Сообщений: 16250 - Андрей

  • 13 ноября 2017, 21:36
+
0
Хорошо, будем ждать следующий месяц
avatar

  7  PetrovMaxim Автор Сообщений: 119 - Максим

  • 13 ноября 2017, 21:56
+
0
Андрей, спасибо, все работает как надо, только в советника мартин, а хотелось бы чтобы первые стоповые ордера открывались допустим лотом 1, после того как сработает один из первых стоповых ордеров все последующие отложенные ордера открывались допустим только лотом 2, пока все не закроется по общему профиту, после чего снова открываются два отложенные ордера первоначальным лотом.



Сделайте так:


   if(CountTrades()>0)
     {
      if(CountOrders(4)<1 && LastOrderType()==0) PutOrder(5,LastOrderPrice()-Step*Point,Lots*2);
      if(CountOrders(5)<1 && LastOrderType()==1) PutOrder(4,LastOrderPrice()+Step*Point,Lots*2);
     }


Вариант в базе менять не буду т.к. он более интересен. Если не разберетесь скину другим файлом.
avatar

  35  AM2 Сообщений: 16250 - Андрей

  • 14 ноября 2017, 17:41
+
0
Спасибо!
avatar

  7  PetrovMaxim Автор Сообщений: 119 - Максим

  • 15 ноября 2017, 20:12

Зарегистрируйтесь или авторизуйтесь, чтобы оставить комментарий