Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 1093

 
A13ksandr:Сорри! Конечно всё в void OnTick() происходит. Описался)
Тогда в журнале тестера код ошибки валяется, по нему можно дальше разбираться.
 
evillive:
Тогда в журнале тестера код ошибки валяется, по нему можно дальше разбираться.

Нет ошибки. Просто виснет при переходе в процедуру. Причем есть еще StartSell, в нее он нормально заходит. Муть какая-то.

Обновил котировки - стало работать. Неправильно из-за дыр, но хотя бы не зависает.

 

Приветствую! Подскажите, пожалуйста, как лучше прописать запрет  на одновременное открытие более установленного значения числа серий по разным инструментам (бот прикреплен одновременно к нескольким графикам различных инструментов) на бинарных опционах?

 

extern double       Lots             = 1;      // Лот

extern int          Exp              = 1;      // Експирация

extern int          Wait             = 0;      // Количество свечей одного направления

extern int          Timeout          = 1;      // Промежуток времени

extern double       Multiplier       = 3;      // Множитель

extern int          Slippage         = 5;      // Проскальзывание

extern int          MaxOpenOrders    = 1;       // Максимальное количество одновременно открытых ордеров

extern int          Magic            = 774274; // Магик


int ticket, Type; 

double Price, Lot;

//+------------------------------------------------------------------+

//| Expert initialization function                                   |

//+------------------------------------------------------------------+

int OnInit()

{

   

   return(INIT_SUCCEEDED);

}

//+------------------------------------------------------------------+

//| Expert deinitialization function                                 |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

{

   

}

//+------------------------------------------------------------------+

//| Expert tick function                                             |

//+------------------------------------------------------------------+

void OnTick()

{

   // --------------- Открытие сделок ---------------

   if (CountTrades() == 0) // Количество ордеров должно равняться нулю

   {

      if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY))

       || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL)))

        // Если последняя сделка убыточная, то открывается такая же, но с увеличенным лотом

      {

         Type = TypeLastHistOrder();

         if (Type == OP_BUY)  Price = Ask;

         if (Type == OP_SELL) Price = Bid;

         Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2);

         

         ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

      }

      if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0) 

      // Если прибыль последней сделки равняется нулю, то открывается такая же

      {

         Type = TypeLastHistOrder();

         if (Type == OP_BUY)  Price = Ask;

         if (Type == OP_SELL) Price = Bid;

         Lot = NormalizeDouble(LotsLastHistOrder(), 2);

         

         ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

      }

      if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))

       || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL)))

        || CountHistTrades() == 0)// Если последняя сделка прибыльная, то открывается ордер

      {

         if (SignalBuy() && MaxOpenOrders > OrdersTotal())

         {

            ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);

         }

         if (SignalSell() && MaxOpenOrders > OrdersTotal())

         {

            ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);

         }

      }

   }

}

//+------------------------------------------------------------------+

int CountTrades(int type = -1)

{

   int cnt = 0;

   for (int i=OrdersTotal()-1; i>=0; i--)

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

      {

         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

            cnt++;

      }

   }

   return(cnt);

}

//+------------------------------------------------------------------+

int CountHistTrades(int type = -1)

{

   int cnt = 0;

   for (int i=OrdersHistoryTotal()-1; i>=0; i--)

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

            cnt++;

      }

   }

   return(cnt);

}

//+------------------------------------------------------------------+

bool SignalBuy()

{

   for (int i=1; i<=Wait; i++)

   {

      if (Close[i] > Open[i]) return(false);

   }

   if ((iBarShift(Symbol(), 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout)) 

   && CountHistTrades() > 0) return(true);

   if (CountHistTrades() == 0) return(true);

   

   return(false);

}

//+------------------------------------------------------------------+

bool SignalSell()

{

   for (int i=1; i<=Wait; i++)

   {

      if (Close[i] < Open[i]) return(false);

   }

   if ((iBarShift(Symbol(), 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout))

    && CountHistTrades() > 0) return(true);

   if (CountHistTrades() == 0) return(true);

   

   return(false);

}

//+------------------------------------------------------------------+

datetime TimeLastHistOrder(int type = -1)

{

   datetime lasttime = 0;

   datetime opentime = 0;


   for (int i=OrdersHistoryTotal()-1; i>=0; i--)

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

         {

            if (OrderCloseTime() > lasttime)

            {

               lasttime = OrderCloseTime();

               opentime = OrderOpenTime();

            }

         }

      }

   }

   

   return(opentime);

}

//+------------------------------------------------------------------+

int TypeLastHistOrder()

{

   datetime time = 0;

   int type = -1;

   

   for (int i=OrdersHistoryTotal()-1; i>=0; i--)

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)

         {

            if (OrderCloseTime() > time)

            {

               time = OrderCloseTime();

               type = OrderType();

            }

         }

      }

   }

   

   return(type);

}

//+------------------------------------------------------------------+

double LotsLastHistOrder(int type = -1)

{

   datetime time = 0;

   double lots = 0;

   

   for (int i=OrdersHistoryTotal()-1; i>=0; i--)

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

         {

            if (OrderOpenTime() > time)

            {

               time = OrderOpenTime();

               lots = OrderLots();

            }

         }

      }

   }

   

   return(lots);

}

//+------------------------------------------------------------------+

double PriceCloseLastHistOrder(int type = -1)

{

   datetime time = 0;

   double price = 0;

   

   for (int i=OrdersHistoryTotal()-1; i>=0; i--)

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

         {

            if (OrderCloseTime() > time)

            {

               time = OrderCloseTime();

               price = OrderClosePrice();

            }

         }

      }

   }

   

   return(price);

}

//+------------------------------------------------------------------+

double PriceOpenLastHistOrder(int type = -1)

{

   datetime time = 0;

   double price = 0;

   

   for (int i=OrdersHistoryTotal()-1; i>=0; i--)

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

         {

            if (OrderCloseTime() > time)

            {

               time = OrderCloseTime();

               price = OrderOpenPrice();

            }

         }

      }

   }

   

   return(price);

}

//+------------------------------------------------------------------+ 

 
alvlaf:

Просто исключить из функции CountTrades условие OrderSymbol() == Symbol() и добавить OrderType() == OP_BUY || OrderType() == OP_SELL, разве нет?

И в OnTick перед OrderSend изменить условие  if (SignalBuy() && CountTrades() < MaxOpenOrders)... И на продажу аналогично.
 
A13ksandr:
Спасибо, попробовал - бот стал открывать кучу ордеров на каждом тике.
 
A13ksandr:

if (OrderMagicNumber() == Magic && (OrderType() == OrderType() == OP_BUY || OrderType() == OP_SELL))

Я правильно изменил? 

 
alvlaf:

Приветствую! Подскажите, пожалуйста, как лучше прописать запрет  на одновременное открытие более установленного значения числа серий по разным инструментам (бот прикреплен одновременно к нескольким графикам различных инструментов) на бинарных опционах?

 

extern double       Lots             = 1;      // Лот

extern int          Exp              = 1;      // Експирация

extern int          Wait             = 0;      // Количество свечей одного направления

extern int          Timeout          = 1;      // Промежуток времени

extern double       Multiplier       = 3;      // Множитель

extern int          Slippage         = 5;      // Проскальзывание

extern int          MaxOpenOrders    = 1;       // Максимальное количество одновременно открытых ордеров

extern int          Magic            = 774274; // Магик


int ticket, Type; 

double Price, Lot;

//+------------------------------------------------------------------+

//| Expert initialization function                                   |

//+------------------------------------------------------------------+

int OnInit()

{

   

   return(INIT_SUCCEEDED);

}

//+------------------------------------------------------------------+

//| Expert deinitialization function                                 |

//+------------------------------------------------------------------+

void OnDeinit(const int reason)

{

   

}

//+------------------------------------------------------------------+

//| Expert tick function                                             |

//+------------------------------------------------------------------+

void OnTick()

{

   // --------------- Открытие сделок ---------------

   if (CountTrades() == 0) // Количество ордеров должно равняться нулю

   {

      if ((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) < PriceOpenLastHistOrder(OP_BUY))

       || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) > PriceOpenLastHistOrder(OP_SELL)))

        // Если последняя сделка убыточная, то открывается такая же, но с увеличенным лотом

      {

         Type = TypeLastHistOrder();

         if (Type == OP_BUY)  Price = Ask;

         if (Type == OP_SELL) Price = Bid;

         Lot = NormalizeDouble(LotsLastHistOrder()*Multiplier, 2);

         

         ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

      }

      if (PriceCloseLastHistOrder() == PriceOpenLastHistOrder() && CountHistTrades() > 0) 

      // Если прибыль последней сделки равняется нулю, то открывается такая же

      {

         Type = TypeLastHistOrder();

         if (Type == OP_BUY)  Price = Ask;

         if (Type == OP_SELL) Price = Bid;

         Lot = NormalizeDouble(LotsLastHistOrder(), 2);

         

         ticket = OrderSend(Symbol(), Type, Lot, Price, Slippage, 0, 0, IntegerToString(Exp), Magic);

      }

      if (((TypeLastHistOrder() == OP_BUY && PriceCloseLastHistOrder(OP_BUY) > PriceOpenLastHistOrder(OP_BUY))

       || (TypeLastHistOrder() == OP_SELL && PriceCloseLastHistOrder(OP_SELL) < PriceOpenLastHistOrder(OP_SELL)))

        || CountHistTrades() == 0)// Если последняя сделка прибыльная, то открывается ордер

      {

         if (SignalBuy() && MaxOpenOrders > OrdersTotal())

         {

            ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, IntegerToString(Exp), Magic);

         }

         if (SignalSell() && MaxOpenOrders > OrdersTotal())

         {

            ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, IntegerToString(Exp), Magic);

         }

      }

   }

}

//+------------------------------------------------------------------+

int CountTrades(int type = -1)

{

   int cnt = 0;

   for (int i=OrdersTotal()-1; i>=0; i--)

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

      {

         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

            cnt++;

      }

   }

   return(cnt);

}

//+------------------------------------------------------------------+

int CountHistTrades(int type = -1)

{

   int cnt = 0;

   for (int i=OrdersHistoryTotal()-1; i>=0; i--)

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

            cnt++;

      }

   }

   return(cnt);

}

//+------------------------------------------------------------------+

bool SignalBuy()

{

   for (int i=1; i<=Wait; i++)

   {

      if (Close[i] > Open[i]) return(false);

   }

   if ((iBarShift(Symbol(), 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout)) 

   && CountHistTrades() > 0) return(true);

   if (CountHistTrades() == 0) return(true);

   

   return(false);

}

//+------------------------------------------------------------------+

bool SignalSell()

{

   for (int i=1; i<=Wait; i++)

   {

      if (Close[i] < Open[i]) return(false);

   }

   if ((iBarShift(Symbol(), 0, TimeLastHistOrder()+Timeout) >= Wait || (Wait == 0 && TimeCurrent() >= TimeLastHistOrder()+Timeout))

    && CountHistTrades() > 0) return(true);

   if (CountHistTrades() == 0) return(true);

   

   return(false);

}

//+------------------------------------------------------------------+

datetime TimeLastHistOrder(int type = -1)

{

   datetime lasttime = 0;

   datetime opentime = 0;


   for (int i=OrdersHistoryTotal()-1; i>=0; i--)

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

         {

            if (OrderCloseTime() > lasttime)

            {

               lasttime = OrderCloseTime();

               opentime = OrderOpenTime();

            }

         }

      }

   }

   

   return(opentime);

}

//+------------------------------------------------------------------+

int TypeLastHistOrder()

{

   datetime time = 0;

   int type = -1;

   

   for (int i=OrdersHistoryTotal()-1; i>=0; i--)

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)

         {

            if (OrderCloseTime() > time)

            {

               time = OrderCloseTime();

               type = OrderType();

            }

         }

      }

   }

   

   return(type);

}

//+------------------------------------------------------------------+

double LotsLastHistOrder(int type = -1)

{

   datetime time = 0;

   double lots = 0;

   

   for (int i=OrdersHistoryTotal()-1; i>=0; i--)

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

         {

            if (OrderOpenTime() > time)

            {

               time = OrderOpenTime();

               lots = OrderLots();

            }

         }

      }

   }

   

   return(lots);

}

//+------------------------------------------------------------------+

double PriceCloseLastHistOrder(int type = -1)

{

   datetime time = 0;

   double price = 0;

   

   for (int i=OrdersHistoryTotal()-1; i>=0; i--)

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

         {

            if (OrderCloseTime() > time)

            {

               time = OrderCloseTime();

               price = OrderClosePrice();

            }

         }

      }

   }

   

   return(price);

}

//+------------------------------------------------------------------+

double PriceOpenLastHistOrder(int type = -1)

{

   datetime time = 0;

   double price = 0;

   

   for (int i=OrdersHistoryTotal()-1; i>=0; i--)

   {

      if (OrderSelect(i, SELECT_BY_POS, MODE_HISTORY))

      {

         if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && (OrderType() == type || type == -1))

         {

            if (OrderCloseTime() > time)

            {

               time = OrderCloseTime();

               price = OrderOpenPrice();

            }

         }

      }

   }

   

   return(price);

}

//+------------------------------------------------------------------+ 

Скажите пожалуйста, а с какой целью Вы используете MagicNumber, что он дает в этой стратегии? ИМХО, здесь также можно выбросить функции OnInit OnDeinit
 
evillive:


Время можно задавать сразу в формате datetime, не надо машинное время терять на преобразование, вот так работает:

extern datetime StartTime = D'07:00'; 

В таком формате времени при запуске советника получаем дату компиляции советника, а хотелось бы сегодняшнюю. 

Как исправить? 

 
RichLux:

В таком формате времени при запуске советника получаем дату компиляции советника, а хотелось бы сегодняшнюю. 

Как исправить? 

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

И мне почему-то показывает текущую дату на момент запуска скрипта. 

 
LRA:
Скажите пожалуйста, а с какой целью Вы используете MagicNumber, что он дает в этой стратегии? ИМХО, здесь также можно выбросить функции OnInit OnDeinit
С какой целью выделены слова "в этой стратегии"? Magic нужен, если на счете заключаются сделки вручную или еще другой советник запущен, чтобы эти ордер не трогать. По-моему так.
Причина обращения: