Помогите отредактировать код.

 

Друзья, я полный лох в программировании. Только учусь. Помогите, пожалуйста.

Мне нужно, чтобы робот в тестере на М1 выставлял лимитные ордера по цене открытия того минутного бара, который прошел в определенное время (день, часы, минуты). У меня советник выставляет и открывает кучу сделок вместо одной. Посмотрите, пожалуйста, что надо изменить в коде, чтобы он открывал только одну сделку для заданных параметров времени? Мне кажется, что со временем что-то не то. Проверка if(OrdersTotal ()<1)  для ликвидации этого бага не подойдет, т.к. эксперт будет иметь несколько временных параметров, соответственно, должен будет выставить и открыть несколько ордеров.

double lot                    = 0.2;

double TakeProfitPips       = 50; 

double StopLossPips         = 200;  

int bar =0;

int              i     =1; 

 

void OnTick()

  {

if(iTime(Symbol(),PERIOD_M1, 1) == D'15.01.2016 11:43') 

     {

 double price =  Open[i];

 OrderSend(Symbol(),OP_BUYLIMIT,lot,price,3,Ask-StopLossPips*Point,Ask+TakeProfitPips*Point);

return;

   }

  } 

 
Andrey Pototskiy:

Друзья, я полный лох в программировании. Только учусь. Помогите, пожалуйста.

Мне нужно, чтобы робот в тестере на М1 выставлял лимитные ордера по цене открытия того минутного бара, который прошел в определенное время (день, часы, минуты). У меня советник выставляет и открывает кучу сделок вместо одной. Посмотрите, пожалуйста, что надо изменить в коде, чтобы он открывал только одну сделку для заданных параметров времени? Мне кажется, что со временем что-то не то. Проверка if(OrdersTotal ()<1)  для ликвидации этого бага не подойдет, т.к. эксперт будет иметь несколько временных параметров, соответственно, должен будет выставить и открыть несколько ордеров.


Учимся правильно вставлять код в сообщение кнопочка SRC на панели нового сообщения

//+------------------------------------------------------------------+
//|                                                       помощь.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

input double   lot                  = 0.2;
input double   TakeProfitPips       = 50;
input double   StopLossPips         = 200;

int bar=0;
int i=1;
int tiket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(iTime(Symbol(),PERIOD_M1,1)==D'15.01.2016 11:43' && Total_orders(Symbol(),OP_BUYLIMIT)==0)
     {
      double   price=Open[i];

      tiket=OrderSend(Symbol(),OP_BUYLIMIT,lot,price,3,price-StopLossPips*Point,price+TakeProfitPips*Point);
      if(tiket<0)
        {
         Print("Ошибка OrderSend № - ",GetLastError());
        }
     }
  }
//+------------------------------------------------------------------+
int Total_orders(string symbol,int type)
  {
   int n=0;
   int total=OrdersTotal();

   for(int i=0; i<total; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderType()!=type)continue;
         //if(OrderMagicNumber()!=Magic)continue;
         if(OrderSymbol()!=symbol)continue;
         n++;
        }
     }
   return(n);
  }
//+------------------------------------------------------------------+
 

Спасибо!!! Т.е.  я так понимаю, что если время с точностью до минут такое и ордер на этой минуте стоит -  не выставляем лимитник. А если время хоть на минуту другое - то это уже другое условие и тогда лимитник выставится, но только один ))) По логике должно быть так ))) Спасибо БОЛЬШОЕ!!

 
Andrey Pototskiy:

Спасибо!!! Т.е.  я так понимаю, что если время с точностью до минут такое и ордер на этой минуте стоит -  не выставляем лимитник. А если время хоть на минуту другое - то это уже другое условие и тогда лимитник выставится, но только один ))) По логике должно быть так ))) Спасибо БОЛЬШОЕ!!

Рыночники надо открывать.
 

Вот открыл он все-таки 3 сделки )) https://gyazo.com/3bee20260ecc8d843c98657f907ebf14

Хорошо, что не кучу. Уже плюс. Но все-таки, почему не одну, а три открыл?

 
Andrey Pototskiy:

Спасибо!!! Т.е.  я так понимаю, что если время с точностью до минут такое и ордер на этой минуте стоит -  не выставляем лимитник. А если время хоть на минуту другое - то это уже другое условие и тогда лимитник выставится, но только один ))) По логике должно быть так ))) Спасибо БОЛЬШОЕ!!

Не совсем так, выставиться лимитники если оба условия верны, если хоть одно будет ложным ни чего не выставиться. И согласен с Виктором, скорее всего когда наступит условие вы получите ошибку 129

 

"Рыночники надо открывать."

 

А почему не лимитники?

 

При компиляции вы должны были получить предупреждение

declaration of 'i' hides global declaration at line 16  помощь.mq4      57      12

 

замените имя переменной i на любое другое имя 

 
Andrey Pototskiy:

"Рыночники надо открывать."

 

А почему не лимитники?

Sergey Gritsay:

Не совсем так, выставиться лимитники если оба условия верны, если хоть одно будет ложным ни чего не выставиться. И согласен с Виктором, скорее всего когда наступит условие вы получите ошибку 129

Тогда это не совсем то, что мне надо. Видимо, не совсем я понимаю все глубины наших глубин )). Вероятно, код может быть не такой простой. Мне нужно, чтобы он не выставлял ордера, если ордер уже выставлен на определенной минуте, а если он выставлен на другой минуте - то выставлял бы при условии, что есть несколько временных параметров.

И главное, все-таки не понятно, почему условие  Total_orders(Symbol(),OP_BUYLIMIT)==0 не выполняется. 

 
Andrey Pototskiy:

Тогда это не совсем то, что мне надо. Видимо, не совсем я понимаю все глубины наших глубин )). Вероятно, код может быть не такой простой. Мне нужно, чтобы он не выставлял ордера, если ордер уже выставлен на определенной минуте, а если он выставлен на другой минуте - то выставлял бы при условии, что есть несколько временных параметров.

И главное, все-таки не понятно, почему условие  Total_orders(Symbol(),OP_BUYLIMIT)==0 не выполняется. 

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

//+------------------------------------------------------------------+
//|                                                       помощь.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

input double   lot                  = 0.2;
input double   TakeProfitPips       = 50;
input double   StopLossPips         = 200;

int bar=0;
int shift=1;
int tiket;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(iTime(Symbol(),PERIOD_M1,1)==D'15.01.2016 11:43' && Total_orders(Symbol(),OP_BUYLIMIT))
     {
      double   price=Open[shift];

      tiket=OrderSend(Symbol(),OP_BUYLIMIT,lot,price,3,price-StopLossPips*Point,price+TakeProfitPips*Point);
      if(tiket<0)
        {
         Print("Ошибка OrderSend № - ",GetLastError());
        }
     }
  }
//+------------------------------------------------------------------+
int Total_orders(string symbol,int type)
  {
   int n=0;
   int total=OrdersTotal();

   for(int i=0; i<total; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderType()!=type)continue;
         //if(OrderMagicNumber()!=Magic)continue;
         if(OrderSymbol()!=symbol)continue;
         n++;
        }
     }
   return(n);
  }
//+------------------------------------------------------------------+
 
Andrey Pototskiy:

Тогда это не совсем то, что мне надо. Видимо, не совсем я понимаю все глубины наших глубин )). Вероятно, код может быть не такой простой. Мне нужно, чтобы он не выставлял ордера, если ордер уже выставлен на определенной минуте, а если он выставлен на другой минуте - то выставлял бы при условии, что есть несколько временных параметров.

И главное, все-таки не понятно, почему условие  Total_orders(Symbol(),OP_BUYLIMIT)==0 не выполняется. 

тогда примерно как то так. Будет выставлять только при появлении нового бара

 

//+------------------------------------------------------------------+
//|                                                       помощь.mq4 |
//|                        Copyright 2016, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

input double   lot                  = 0.2;
input double   TakeProfitPips       = 50;
input double   StopLossPips         = 200;

int bar=0;
int shift=1;
int tiket;

datetime          curbar;
datetime          lastbar;
double   price;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//--- create timer
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//--- destroy timer
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(new_bar(_Symbol,PERIOD_M1))
     {
      if(iTime(Symbol(),PERIOD_M1,1)==D'15.01.2016 11:43')
        {
         price=Open[shift];

         tiket=OrderSend(Symbol(),OP_BUYLIMIT,lot,price,3,price-StopLossPips*Point,price+TakeProfitPips*Point);
         if(tiket<0)
           {
            Print("Ошибка OrderSend № - ",GetLastError());
           }
        }

      if(iTime(Symbol(),PERIOD_M1,1)==D'15.01.2016 11:50')
        {
         price=Open[shift];

         tiket=OrderSend(Symbol(),OP_BUYLIMIT,lot,price,3,price-StopLossPips*Point,price+TakeProfitPips*Point);
         if(tiket<0)
           {
            Print("Ошибка OrderSend № - ",GetLastError());
           }
        }

      if(iTime(Symbol(),PERIOD_M1,1)==D'15.01.2016 11:45')
        {
         price=Open[shift];

         tiket=OrderSend(Symbol(),OP_BUYLIMIT,lot,price,3,price-StopLossPips*Point,price+TakeProfitPips*Point);
         if(tiket<0)
           {
            Print("Ошибка OrderSend № - ",GetLastError());
           }
        }
     }

  }
//+------------------------------------------------------------------+
int Total_orders(string symbol,int type)
  {
   int n=0;
   int total=OrdersTotal();

   for(int i=0; i<total; i++)
     {
      if(OrderSelect(i,SELECT_BY_POS))
        {
         if(OrderType()!=type)continue;
         //if(OrderMagicNumber()!=Magic)continue;
         if(OrderSymbol()!=symbol)continue;
         n++;
        }
     }
   return(n);
  }
//+------------------------------------------------------------------+
bool new_bar(string symbol,ENUM_TIMEFRAMES period)
  {
   curbar=(datetime) SeriesInfoInteger(symbol,period,SERIES_LASTBAR_DATE);
   if(lastbar==0)lastbar=(datetime)SeriesInfoInteger(symbol,period,SERIES_LASTBAR_DATE);
   if(lastbar!=curbar)
     {
      lastbar=curbar;
      return(true);
     }
   return(false);
  }
//+------------------------------------------------------------------+
Причина обращения: