Робот дублирует сделки

 

Мне нужно было создать робот для бинарных опционов по своему индикатору. Нашел шаблон и адаптировал его под индикатор, но есть проблема, он периодически дублирует ордера (то есть появляется сигнал на BUY, он открывает ордер на BUY и через несколько секунд открывает еще один BUY, а то и не один. то есть получается по два ордера на разных уровнях).

Подскажите что не так, вроде лишнего то ни че нету...

 

//+------------------------------------------------------------------+
//|                                                       Option.mq4 |
//|                                              Copyright 2015, AM2 |
//|                                      http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2015, AM2"
#property link      "http://www.forexsystems.biz"
#property description "Simple expert advisor"

// Переменные индикатора
int i;
double order_line;

//--- Inputs
extern double Lot          = 50.0;   // ставка в валюте
extern string Expiration   = "1";    // время истечения в минутах
extern int    Magic        = 1988;   // магик
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   Comment("");
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
  
//+------------------------------------------------------------------+
//| OnTick function                                                  |
//+------------------------------------------------------------------+
void OnTick()
  {
//##########################################################

// ТУТ ПРОПИСЫВАЮ КОД ИНДИКАТОРА ДЛЯ ОТКРЫТИЯ СДЕЛОК
   //Пример
   if(Close[i+1] > Open[i+1]) order_line = 5;
   else if(Close[i+1] < Open[i+1]) order_line = -5;
   else order_line = 0;
//##########################################################

      //+------------------------------------------------------------------+
      //| Система открытия ордеров                                         |
      //+------------------------------------------------------------------+
      int res;
      double ask=MarketInfo(OrderSymbol(),MODE_ASK);
      double bid=MarketInfo(OrderSymbol(),MODE_BID);
      //--- buy
      if(order_line == 5)
      {
          res=OrderSend(Symbol(),OP_BUY,Lot,ask,0,0,0,Expiration,Magic,0,Blue);
          return;
      }
      //--- sell
      if(order_line == -5)
      {
          res=OrderSend(Symbol(),OP_SELL,Lot,bid,0,0,0,Expiration,Magic,0,Red);
          return;
      }

//---  
  }
//+------------------------------------------------------------------+
 
Vitalie Postolache:
   if(Close[i+1] > Open[i+1]) order_line = 5;
   else if(Close[i+1] < Open[i+1]) order_line = -5;

Не надо так писать без цикла и с неинициализированной i.

 Задавайте конкретный номер бара.

Вечно все цепляются не за то, я написал это пример кода. В реале не будет не цикла не i
 
uniface:

Мне нужно было создать робот для бинарных опционов по своему индикатору. Нашел шаблон и адаптировал его под индикатор, но есть проблема, он периодически дублирует ордера (то есть появляется сигнал на BUY, он открывает ордер на BUY и через несколько секунд открывает еще один BUY, а то и не один. то есть получается по два ордера на разных уровнях).

Подскажите что не так, вроде лишнего то ни че нету...

 

// ТУТ ПРОПИСЫВАЮ КОД ИНДИКАТОРА ДЛЯ ОТКРЫТИЯ СДЕЛОК
   //Пример
   if(Close[i+1] > Open[i+1]) order_line = 5;
   else if(Close[i+1] < Open[i+1]) order_line = -5;
   else order_line = 0;
//##########################################################
У Вас лишнее в том, что сделка будет открываться по каждому тику, если условие входа по индикатору выполняется. Можно, например, если функция OrderSend выполнена успешно, запрашивать время открытия ордера и ставить доп. условие, что с момента открытия предыдущей сделки должно пройти время не менее PeriodSeconds(_Period). Опять-таки это все условно, т. к. я не знаю Ваши правила входа по индикатору, если вход, например, по стрелочному индикатору, того, что я пишу достаточно.
 
uniface:
Вечно все цепляются не за то, я написал это пример кода. В реале не будет не цикла не i

А чтобы не цеплялись, не нужно писать чушь в коде ;)

Тут не знает никто, что вы там на самом деле написали с индикатором, если подменять код, то хоть на "условно рабочий".

 
Пожалуйста корректно высказывайте свои мысли и не допускайте оскорблений и бранных слов. Посты будут сносится начисто.
 
Alexander Belozerov:
У Вас лишнее в том, что сделка будет открываться по каждому тику, если условие входа по индикатору выполняется. Можно, например, если функция OrderSend выполнена успешно, запрашивать время открытия ордера и ставить доп. условие, что с момента открытия предыдущей сделки должно пройти время не менее PeriodSeconds(_Period). Опять-таки это все условно, т. к. я не знаю Ваши правила входа по индикатору, если вход, например, по стрелочному индикатору, того, что я пишу достаточно.
Да спасибо, я просто сделал при открытии сделки - обнуление сигнала.
 
Vladimir Karputov:
Пожалуйста корректно высказывайте свои мысли и не допускайте оскорблений и бранных слов. Посты будут сносится начисто.

Это конечно хорошая вещь в целом.

Только фразы Vitalie Postolache можно назвать верхом тактичности и вежливости по сравнению с постами от некоторых других. Для сравнения: https://www.mql5.com/ru/forum/3457/page3448#comment_3873161

 
Dina Paches:


Пожалуйста, если Вы не в курсе проблемы, то не пытайтесь ставить комментарии.
Причина обращения: