Скачать MetaTrader 5

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

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Нужен торговый робот? Закажи его в сервисе Фриланс!
Andrey Pototskiy
198
Andrey Pototskiy 2016.02.26 13:42 

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

Мне нужно, чтобы робот в тестере на М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;

   }

  } 

Sergey Gritsay
6457
Sergey Gritsay 2016.02.26 14:49  
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
198
Andrey Pototskiy 2016.02.26 14:59  

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

Victor Nikolaev
Модератор
14483
Victor Nikolaev 2016.02.26 15:04  
Andrey Pototskiy:

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

Рыночники надо открывать.
Andrey Pototskiy
198
Andrey Pototskiy 2016.02.26 15:17  

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

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

Sergey Gritsay
6457
Sergey Gritsay 2016.02.26 15:17  
Andrey Pototskiy:

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

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

Andrey Pototskiy
198
Andrey Pototskiy 2016.02.26 15:18  

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

 

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

Sergey Gritsay
6457
Sergey Gritsay 2016.02.26 15:27  

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

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

 

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

Andrey Pototskiy
198
Andrey Pototskiy 2016.02.26 15:36  
Andrey Pototskiy:

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

 

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

Sergey Gritsay:

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

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

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

Sergey Gritsay
6457
Sergey Gritsay 2016.02.26 15:54  
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);
  }
//+------------------------------------------------------------------+
Sergey Gritsay
6457
Sergey Gritsay 2016.02.26 16:07  
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);
  }
//+------------------------------------------------------------------+
12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий