Ребятки,помогите новичку - идиоту разобраться с написанием советника(выставление ордеров).

 

Ребята, нужна помощь в написании советника. Я смотрел видеоуроки, читал книгу по MQL4, но вот нигде не было хоть какого то примера для очень простого советника, везде идут примеры с использованием каких либо индикаторов.

В общем суть очень простая, на определенном уровне ставится 3 ордера на покупку и 3 ордера на продажу с разными TP и SL. То же самое делается и на другом уровне. И все бы ничего, но когда я это тестирую открывается далеко не 12 ордеров, а на много больше, т.к.(как я понял)ордера открываются каждый раз, когда пробиваются эти уровни . А мне надо, что бы открылось 6 ордеров по пробою одного уровня, и новый ордер на этом уровне опять стал только по достижению TP или SL.

Вот код,который я написал...

void OnTick()
{
   int ticket;
//Цена 0.71000
   ticket = OrderSend("AUDUSD", OP_BUYLIMIT, 0.1, 0.71000, 3, 0.70900, 0.71500, "", 123, 0, Blue);//
   ticket = OrderSend("AUDUSD", OP_BUYLIMIT, 0.1, 0.71000, 3, 0.70800, 0.72000, "", 123, 0, Blue);//Ордера на покупку
   ticket = OrderSend("AUDUSD", OP_BUYLIMIT, 0.1, 0.71000, 3, 0.70500, 0.72500, "", 123, 0, Blue);//

   ticket = OrderSend("AUDUSD", OP_SELLLIMIT, 0.1, 0.71000, 3, 0.71100, 0.70500, "", 123, 0, Red);//
   ticket = OrderSend("AUDUSD", OP_SELLLIMIT, 0.1, 0.71000, 3, 0.71200, 0.70000, "", 123, 0, Red);//Ордера на продажу
   ticket = OrderSend("AUDUSD", OP_SELLLIMIT, 0.1, 0.71000, 3, 0.71500, 0.69500, "", 123, 0, Red);//
//------------------------------------------------------------------------------------------------//
//Цена 0.71250
   ticket = OrderSend("AUDUSD", OP_BUYLIMIT, 0.1, 0.71250, 3, 0.71150, 0.71750, "", 123, 0, Blue);//
   ticket = OrderSend("AUDUSD", OP_BUYLIMIT, 0.1, 0.71250, 3, 0.71050, 0.72250, "", 123, 0, Blue);//Ордера на покупку
   ticket = OrderSend("AUDUSD", OP_BUYLIMIT, 0.1, 0.71250, 3, 0.70750, 0.72750, "", 123, 0, Blue);//

   ticket = OrderSend("AUDUSD", OP_SELLLIMIT, 0.1, 0.71250, 3, 0.71350, 0.70750, "", 123, 0, Red);//
   ticket = OrderSend("AUDUSD", OP_SELLLIMIT, 0.1, 0.71250, 3, 0.71450, 0.70250, "", 123, 0, Red);//Ордера на продажу
   ticket = OrderSend("AUDUSD", OP_SELLLIMIT, 0.1, 0.71250, 3, 0.71750, 0.69750, "", 123, 0, Red);//
}

 

А визуально это выглядит как на картинке
(
 показана эта часть кода

     ticket = OrderSend("AUDUSD", OP_BUYLIMIT, 0.1, 0.71000, 3, 0.70900, 0.71500, "", 123, 0, Blue);
     ticket = OrderSend("AUDUSD", OP_SELLLIMIT, 0.1, 0.71000, 3, 0.71100, 0.70500, "", 123, 0, Red);

)

 

Я думал что может после каждого OrderSend писать if ,и там уже указать, что если открыт один ордер, повторно выставлять его только после достижения профита или лося, вот только не могу правильно сформулировать это на языке MQL4...

Файлы:
AUDUSDM5.png  32 kb
 
при такой реализации он у вас должен на каждом тике штамповать отложки, где условия выставления ордеров? где проверка что ордера уже выставлены?
 
Sergey Gritsay:
при такой реализации он у вас должен на каждом тике штамповать отложки, где условия выставления ордеров? где проверка что ордера уже выставлены?
"И все бы ничего, но когда я это тестирую открывается далеко не 12 ордеров, а на много больше, т.к.(как я понял)ордера открываются каждый раз, когда пробиваются эти уровни "
Именно с этой проблемой я и обратился))Я понимаю,что должны быть еще дополнительные условия для выставления ордера,вот только я не знаю как их правильно составить...
 
Bullov:
"И все бы ничего, но когда я это тестирую открывается далеко не 12 ордеров, а на много больше, т.к.(как я понял)ордера открываются каждый раз, когда пробиваются эти уровни "
Именно с этой проблемой я и обратился))Я понимаю,что должны быть еще дополнительные условия для выставления ордера,вот только я не знаю как их правильно составить...

есть у вас во первых ошибки по выставлению отложенных ордеров, вот описание из справки терминала

 

  • Отложенный ордер
    Отложенный ордер — это распоряжение брокерской компании купить или продать финансовый инструмент в будущем по заданной цене. Данный ордер используется для открытия торговой позиции при условии равенства будущих котировок установленному уровню. Существует четыре типа отложенных ордеров:
  • Buy Limit — купить при равенстве будущей цены "Ask" установленному значению. При этом текущий уровень цен больше значения установленного ордера. Обычно ордера этого типа выставляются в расчете на то, что цена инструмента, опустившись до определенного уровня, начнет расти;
  • Buy Stop — купить при равенстве будущей цены "Ask" установленному значению. При этом текущий уровень цен меньше значения установленного ордера. Обычно ордера этого типа выставляются в расчете на то, что цена инструмента преодолеет некий уровень и продолжит свой рост;
  • Sell Limit — продать при равенстве будущей цены "Bid" установленному значению. При этом текущий уровень цен меньше значения установленного ордера. Обычно ордера этого типа выставляются в расчете на то, что цена инструмента, поднявшись до определенного уровня, начнет снижаться;
  • Sell Stop — продать при равенстве будущей цены "Bid" установленному значению. При этом текущий уровень цен больше значения установленного ордера. Обычно ордера этого типа выставляются в расчете на то, что цена инструмента достигнет определенного уровня и продолжит снижаться.
 
Sergey Gritsay:

есть у вас во первых ошибки по выставлению отложенных ордеров, вот описание из справки терминала

Пойми меня правильно,я не хочу не с кем ссорится,но но то,что ты мне пишешь - это песня ни о чем.Мне правда очень нужна помощь в написании советника, я хочу понять что и как делать,что бы в будущем мог сам писать и помогать другим,но то,что ты сейчас пишешь,это или повторение моего текста или просто текст справки,который без объяснения моей ошибки и как ее исправить абсолютно бессмыслен.
Сергей,я еще раз повторюсь,я ни в коем случае не хочу ссорится и я очень рад что хоть кто то ответил на сообщения,но я прошу помочь разобраться,а не просто тыкать меня носом в ошибки.

По поводу неправильного выставления ордеров.Я как бы подозревал,что может нужно писать не лимит ордера,а стоп,НО,в видеоруке выставляли лимит ордера,я решил сделать так же само,но я не знаю,как правильно,ведь во время работы советника цена может находится как выше,так и ниже уровня,а от этого зависит тип отложенного ордера,по этму нельзя заранее знать,какой тип ставить...
В общем,как я и сказал,я только учусь и многое непонятно,а без общения с реальными людьми которые что то знают обучение еще сложнее...

А чисто по человечески я готов хоть на пиво деньги скинуть,если реально помогут))))
 
Bullov:
Пойми меня правильно,я не хочу не с кем ссорится,но но то,что ты мне пишешь - это песня ни о чем.Мне правда очень нужна помощь в написании советника, я хочу понять что и как делать,что бы в будущем мог сам писать и помогать другим,но то,что ты сейчас пишешь,это или повторение моего текста или просто текст справки,который без объяснения моей ошибки и как ее исправить абсолютно бессмыслен.
Сергей,я еще раз повторюсь,я ни в коем случае не хочу ссорится и я очень рад что хоть кто то ответил на сообщения,но я прошу помочь разобраться,а не просто тыкать меня носом в ошибки.

По поводу неправильного выставления ордеров.Я как бы подозревал,что может нужно писать не лимит ордера,а стоп,НО,в видеоруке выставляли лимит ордера,я решил сделать так же само,но я не знаю,как правильно,ведь во время работы советника цена может находится как выше,так и ниже уровня,а от этого зависит тип отложенного ордера,по этму нельзя заранее знать,какой тип ставить...
В общем,как я и сказал,я только учусь и многое непонятно,а без общения с реальными людьми которые что то знают обучение еще сложнее...

А чисто по человечески я готов хоть на пиво деньги скинуть,если реально помогут))))

Ну пивом тут не отделаешься:))))))))))

Если ты хочешь понять и в будущем иметь смелость помогать другим, то уж постарайся понимать то, что тебе говорят и пишут в документации.

1. Как вообще работает советник? Что должно произойти чтобы запустился код на исполнение?

Ответ: Поступает очередной тик.

Соответственно при поступлении очередного тика твой код выполняется и открывает очередную партию ордеров согласно алгоритма.


Домашнее задание:

Какое условие можно поставить чтобы при наличии ордеров часть кода не выполнялась?

 

В общем вот что у меня в итоге вышло:

void OnTick()
{
  
   if (OrdersTotal() >= 1)
      {
      return;
      }
   if (Bid < 0.71000 && Bid > 0.70998)
      {
      int ticket;
      ticket = OrderSend("AUDUSD", OP_SELL, 0.1, Bid, 3, 0.71100, 0.70500, "", 123, 0, Red);
      }
 
//-------------------------------------------------------------------------------------------//
    if (OrdersTotal() >= 1)
      {
      return;
      }
    if (Ask > 0.71000 && Ask < 0.71002)
      {
      int ticket;
      ticket = OrderSend("AUDUSD", OP_BUY, 0.1, Ask, 3, 0.70900, 0.71500, "", 123, 0, Blue);
      }
}

 Но появилась новая проблема. Когда открывается один ордер,второй,параллельно ему,не открывается. Я понимаю,что вся загвоздка в OrdersTotal. Все,что осталось сделать это каким то образом указать,что это условие относится непосредственно к одному ордеру,а не ко всему коду.Я уже что только не питался сделать,но ничего не вышло.

Те,кто читает это,очень прошу,не проходите мимо,любая помощь - это уже очень хорошо)))

 
Bullov:

В общем вот что у меня в итоге вышло:

 Но появилась новая проблема. Когда открывается один ордер,второй,параллельно ему,не открывается. Я понимаю,что вся загвоздка в OrdersTotal. Все,что осталось сделать это каким то образом указать,что это условие относится непосредственно к одному ордеру,а не ко всему коду.Я уже что только не питался сделать,но ничего не вышло.

Те,кто читает это,очень прошу,не проходите мимо,любая помощь - это уже очень хорошо)))

Если Вы не программист, не мучайте... коды!! Это непростое дело... Лучше закажите советник
 
Evgeni Inkov:
Если Вы не программист, не мучайте... коды!! Это непростое дело... Лучше закажите советник
Все программисты,когда то были "не программистами".Я понимаю,что это не простое дело,по этому кроме самостоятельного обучения,обращаюсь на форум.
Я не прошу написать мне советник,я всего лишь прошу помочь с одним условием,как его правильно написать 
 

Вариантов может быть целая куча - кому как нравится.

Например, постоянно держит и обрабатывает один ордер: или отложку, или рыночный. Как только ордер уходит в историю (экспирация, удаление, срабатывание стопа или тейка) - выставляет новый:

void OnTick()
  {
   static int t1=-1;
   if(OrderSelect(t1,SELECT_BY_TICKET))//Ордер существует
     {
      if(OrderCloseTime()!=0) t1=-1;//Но уже в истории - разрешаем открыть следующий
      else switch(OrderType())//Иначе, если необходимо, можем обрабатывать ордер - модифицировать, тралить и т.п.
        {
         case OP_BUY:
            //например, тралим стоп-лосс
            break;
         case OP_SELL:
            break;
         case OP_BUYLIMIT:
            break;
         case OP_BUYSTOP:
            //например модифицируем отложку
            break;
         case OP_SELLLIMIT:
            break;
         case OP_SELLSTOP:
            break;
         default: Print("Упс! Сюда попадать не должны никогда!");
        }
     }
   if(!OrderSelect(t1,SELECT_BY_TICKET))//Ордера нет. Пробуем открыть новый
     {
      t1=OrderSend(...);
     }
  }
 
Vladimir Kazakov:

Вариантов может быть целая куча - кому как нравится.

Например, постоянно держит и обрабатывает один ордер: или отложку, или рыночный. Как только ордер уходит в историю (экспирация, удаление, срабатывание стопа или тейка) - выставляет новый:

Огромное тебе спасибо,ты очень помог!!!!)))
Причина обращения: