Обучение программированию MQL4 | Trading Go - Форекс советники, индикаторы и скрипты.
  • Форум восстановлен и работает стабильно!
    Но если что то не отображается нажмите Ctrl+F5
    Благодарим Вас за Ваше Внимание и Понимание!!!
  • Уважаемый гость! Чтобы просмотреть скрытую часть информации Вам нужно зарегистрироваться.

    Быстрая регистрация!

Обучение программированию MQL4

DVA1979

Участник
Регистрация
12 Июн 2016
Сообщения
69
Благодарностей
10
Автор темы #1
Всем привет:)! Отдельная тема для обучения программированию MQL4 на примере собственных советников и скриптов.
В данной теме хотелось бы видеть начинающих программистов (как я), где мы сможем указывать свои тех.задания, сами писать первичный код, а Админ укажет на наши ошибки и поможет "допилить" наше детище.
 

DVA1979

Участник
Регистрация
12 Июн 2016
Сообщения
69
Благодарностей
10
Автор темы #2
Сеточный советник с расширяющимся шагом. Советник открывает сделку по текущей цене. В случае провисания, следующий ордер открывается на заданном расстоянии плюс дельта. Профит всегда равен расстоянию между ордерами. В случае провисания, расстояние между ордерами растет и профит растет (равен расстоянию.)
Lots =0.01; стартовый лот
Step =500; расстояние между первым и вторым ордером
MultiplicatorLot=1.7; множитель лота
Delta =100; дельта расстояния, прибавляется к Step с третьего ордера.
Slippage =30; проскальзывание
Magic =1234; магик, с помощью которого советник находит свои ордера
Два вопроса: нужно чтобы корректно работал "множитель" и просьба детально объяснить, как прописать ограничение по размеру лота.
 

Вложения

Admin

Команда форума
Администратор
Регистрация
3 Янв 2013
Сообщения
2.028
Благодарностей
489
#3
Сеточный советник с расширяющимся шагом. Советник открывает сделку по текущей цене. В случае провисания, следующий ордер открывается на заданном расстоянии плюс дельта. Профит всегда равен расстоянию между ордерами. В случае провисания, расстояние между ордерами растет и профит растет (равен расстоянию.)
Lots =0.01; стартовый лот
Step =500; расстояние между первым и вторым ордером
MultiplicatorLot=1.7; множитель лота
Delta =100; дельта расстояния, прибавляется к Step с третьего ордера.
Slippage =30; проскальзывание
Magic =1234; магик, с помощью которого советник находит свои ордера
Два вопроса: нужно чтобы корректно работал "множитель" и просьба детально объяснить, как прописать ограничение по размеру лота.
Во первых , что вы подразумеваете под словом корректно ??? Если хотите программировать то изьясняйтесь максимально развернуто и точно.
Второе if(lot>100) lot=100;
 

DVA1979

Участник
Регистрация
12 Июн 2016
Сообщения
69
Благодарностей
10
Автор темы #4
Во первых , что вы подразумеваете под словом корректно ??? Если хотите программировать то изьясняйтесь максимально развернуто и точно.
Второй лот умножается. Следующие лоты равны второму. Например при "множителе" равным 2. Первый лот 0,01. Второй и последующие равны 0,02. Нужно чтобы следующие лоты увеличивались. 0,01 0,02 0,04 0,08 и т.д.
 

Admin

Команда форума
Администратор
Регистрация
3 Янв 2013
Сообщения
2.028
Благодарностей
489
#5
Второй лот умножается. Следующие лоты равны второму. Например при "множителе" равным 2. Первый лот 0,01. Второй и последующие равны 0,02. Нужно чтобы следующие лоты увеличивались. 0,01 0,02 0,04 0,08 и т.д.
Покажите Ваш нерабочий фрагмет кода...
 

DVA1979

Участник
Регистрация
12 Июн 2016
Сообщения
69
Благодарностей
10
Автор темы #6
Код:
void OnTick()
  {
   double buy_price=0,sel_price=0;
   int b=0,s=0,type=-1;
   datetime time=NULL;
   for(int i=OrdersTotal()-1; i>=0; i--)
      if(OrderSelect(i,SELECT_BY_POS))
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
           {
            if(OrderType()==OP_BUY)
              {
               b++;
               if(OrderOpenPrice()<buy_price || buy_price==0)
                  buy_price=OrderOpenPrice();
              }
            if(OrderType()==OP_SELL)
              {
               s++;
               if(OrderOpenPrice()>sel_price || sel_price==0)
                  sel_price=OrderOpenPrice();
              }
            if(OrderOpenTime()>time || time==0)
              {
               time=OrderOpenTime();
               type=OrderType();
              }
           }

   if((s+b)==0 ) // покупка
     {
      ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0);
      if(OrderSelect(ticket,SELECT_BY_TICKET))
        {
         TP=NormalizeDouble(Ask+Step*Point,Digits);
         OrderModify(ticket,OrderOpenPrice(),0,TP,0);
        }
     }
   else
   if((b+s)==0 ) // продажа
     {
      ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0);
      if(OrderSelect(ticket,SELECT_BY_TICKET))
        {
         TP=NormalizeDouble(Bid-Step*Point,Digits);
         OrderModify(ticket,OrderOpenPrice(),0,TP,0);
        }
     }
   if((b+s)>0)
     {
      if(type==OP_BUY)
         if((buy_price-Ask)>=NormalizeDouble((Step+Delta*b)*Point(),Digits()))
           {
            ticket=OrderSend(Symbol(),OP_BUY,Lots*MultiplicatorLot,Ask,Slippage,0,0,"",Magic,0);
            if(OrderSelect(ticket,SELECT_BY_TICKET))
              {
               TP=NormalizeDouble(Ask+(Step+Delta*b)*Point(),Digits());
               OrderModify(ticket,OrderOpenPrice(),0,TP,0);
              }
           }
      if(type==OP_SELL)
         if((Bid-sel_price)>=NormalizeDouble((Step+Delta*s)*Point(),Digits()))
           {
            ticket=OrderSend(Symbol(),OP_SELL,Lots*MultiplicatorLot,Bid,Slippage,0,0,"",Magic,0);
            if(OrderSelect(ticket,SELECT_BY_TICKET))
              {
               TP=NormalizeDouble(Bid-(Step+Delta*s)*Point(),Digits());
               OrderModify(ticket,OrderOpenPrice(),0,TP,0);
              }
           }
     }
  }
 

Admin

Команда форума
Администратор
Регистрация
3 Янв 2013
Сообщения
2.028
Благодарностей
489
#7
Вы хотите писать советник сами ? Тогда покажите тот код который не работает или код который Вы не понимаете как написать.
Если Вы хотите что бы я написал Вам все то так и скажите, но у меня сейчас нет времени...

Где код с тем что у Вас не получается ?
 

DVA1979

Участник
Регистрация
12 Июн 2016
Сообщения
69
Благодарностей
10
Автор темы #8
на примере покупки. в первом ордере берет Lots, со второго ордера указал умножать на мультипликатор, но не пойму как сделать чтобы следующие умножались.
Код:
if((s+b)==0 ) // покупка
     {
      ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0);
      if(OrderSelect(ticket,SELECT_BY_TICKET))
        {
         TP=NormalizeDouble(Ask+Step*Point,Digits);
         OrderModify(ticket,OrderOpenPrice(),0,TP,0);
        }
     }
      if((b+s)>0)
     {
      if(type==OP_BUY)
         if((buy_price-Ask)>=NormalizeDouble((Step+Delta*b)*Point(),Digits()))
           {
            ticket=OrderSend(Symbol(),OP_BUY,Lots*MultiplicatorLot,Ask,Slippage,0,0,"",Magic,0);
            if(OrderSelect(ticket,SELECT_BY_TICKET))
              {
               TP=NormalizeDouble(Ask+(Step+Delta*b)*Point(),Digits());
               OrderModify(ticket,OrderOpenPrice(),0,TP,0);
              }
           }
 

Admin

Команда форума
Администратор
Регистрация
3 Янв 2013
Сообщения
2.028
Благодарностей
489
#9
на примере покупки. в первом ордере берет Lots, со второго ордера указал умножать на мультипликатор, но не пойму как сделать чтобы следующие умножались.
Код:
if((s+b)==0 ) // покупка
     {
      ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0);
      if(OrderSelect(ticket,SELECT_BY_TICKET))
        {
         TP=NormalizeDouble(Ask+Step*Point,Digits);
         OrderModify(ticket,OrderOpenPrice(),0,TP,0);
        }
     }
      if((b+s)>0)
     {
      if(type==OP_BUY)
         if((buy_price-Ask)>=NormalizeDouble((Step+Delta*b)*Point(),Digits()))
           {
            ticket=OrderSend(Symbol(),OP_BUY,Lots*MultiplicatorLot,Ask,Slippage,0,0,"",Magic,0);
            if(OrderSelect(ticket,SELECT_BY_TICKET))
              {
               TP=NormalizeDouble(Ask+(Step+Delta*b)*Point(),Digits());
               OrderModify(ticket,OrderOpenPrice(),0,TP,0);
              }
           }
У Вас все написано верно...
Чему равен Ваш мультипликатор ?
 

DVA1979

Участник
Регистрация
12 Июн 2016
Сообщения
69
Благодарностей
10
Автор темы #12
Ошибки в коде нет, первый лот должен быть например 0,01 а второй 0,02
В коде нет ошибки
третий должен быть 0,04
четвертый 0,08.
А получается первый 0,01
второй 0,02
третий 0,02
четвертый 0,02
 
Теги Нет
Сверху