Ошибки по mql5

 

Привет всем !

у меня возникло 2 вопроса по функциям mql5 , первая касательно мультивалютного открытия ордеров (4 ордера по локу), вот код : 

void OnTick()
  {
BB1=GetOrdersTotalByMagic(bmagic1);SS1=GetOrdersTotalByMagic(smagic1);    
BB2=GetOrdersTotalByMagic(bmagic2);SS2=GetOrdersTotalByMagic(smagic2); 
if(TradeAllow==true && t==true){
LongPositionOpen(Symbol_1,bmagic1);//открываем buy по 1-му интсрументу
ShortPositionOpen(Symbol_2,smagic1);//открываем sell по 2-му интсрументу   
if(BB1>0 && SS1>0){t=false;}
}
if(TradeAllow==true && t2==true){
ShortPositionOpen(Symbol_1,smagic2);//открываем buy по 2-му интсрументу
LongPositionOpen(Symbol_2,bmagic2);//открываем sell по 1-му интсрументу
if(BB2>0 && SS2>0){t2=false;}   
  }
}
//+------------------------------------------------------------------+
int GetOrdersTotalByMagic(long const magic_number)
  {
   long order_ticket;
   int total=0;
//--- сделаем выборку всей торговой истории
   HistorySelect(0,TimeCurrent());
//--- пройдем по всем отложенным ордерам
   for(int i=0;i<OrdersTotal();i++)
      if(order_ticket=OrderGetTicket(i))
         if(magic_number==OrderGetInteger(ORDER_MAGIC)) total++;
//---
   return(total);
  }
  void LongPositionOpen(string symbol,int magic)
  {
   MqlTradeRequest mrequest;                            // Будет использоваться для отсылки торговых запросов
   MqlTradeResult mresult;                              // Будет использоваться для получения результатов выполнения торговых запросов    
   Ask = SymbolInfoDouble(symbol,SYMBOL_ASK);   // лучшее предложение на покупку
   Bid = SymbolInfoDouble(symbol,SYMBOL_BID);   // лучшее предложение на продажу
         
         
   

   if(!PositionSelect(symbol))
     {
      mrequest.action = TRADE_ACTION_DEAL;              // немедленное исполнение
      mrequest.price = NormalizeDouble(Ask,_Digits);    // последняя цена ask
      mrequest.sl = 0;                                  // Stop Loss
      mrequest.tp = 0;                                  // Take Profit
      mrequest.symbol = symbol;                        // символ
      mrequest.volume = Lots;                            // количество лотов для торговли
      mrequest.magic = magic;                               // Magic Number
      mrequest.type = ORDER_TYPE_BUY;                   // ордер на покупку
      mrequest.type_filling = ORDER_FILLING_AON;        // тип исполнения ордера - все или ничего
      mrequest.deviation=5;                             // проскальзывание от текущей цены       
      OrderSend(mrequest,mresult);                      // отсылаем ордер
      Print("открыт buy, magic = ",magic);
     
     }
  }
//+------------------------------------------------------------------+
//| Открытие короткой позиции                                        |
//+------------------------------------------------------------------+
void ShortPositionOpen(string symbol,int magic2)
  {
   MqlTradeRequest mrequest;                             // Будет использоваться для отсылки торговых запросов
   MqlTradeResult mresult;                               // Будет использоваться для получения результатов выполнения торговых запросов    
   Ask = SymbolInfoDouble(symbol,SYMBOL_ASK);   // лучшее предложение на покупку
   Bid = SymbolInfoDouble(symbol,SYMBOL_BID);   // лучшее предложение на продажу
         
   
   if(!PositionSelect(symbol))
     {
      mrequest.action = TRADE_ACTION_DEAL;               // немедленное исполнение
      mrequest.price = NormalizeDouble(Bid,_Digits);     // последняя цена Bid        
      mrequest.sl = 0;                                   // Stop Loss
      mrequest.tp = 0;                                   // Take Profit
      mrequest.symbol = symbol;                         // символ
      mrequest.volume = Lots;                             // количество лотов для торговли
      mrequest.magic = magic2;                                // Magic Number
      mrequest.type= ORDER_TYPE_SELL;                    // ордер на продажу
      mrequest.type_filling = ORDER_FILLING_AON;         // тип исполнения ордера - все или ничего
      mrequest.deviation=5;                              // проскальзывание от текущей цены         
      OrderSend(mrequest,mresult);                       // отсылаем ордер
      Print("открыт sell , magic = ",magic2);
     
     }
  } 

 так вот в тестере открывает только первые 2 сделки , а вторую часть игнорирует , но почему ?

и второй вопрос касательно функции ObjectGetValueByTime: 

int OnInit()
  {
ObjectCreateMQL4("Saport", OBJ_TREND, 0,0,0,0,0);//создание трендовой линии

   return(0);
  }

t=iTimeMQL4(_Symbol,0,1);
double d1=ObjectGetValueByTime(0,"Rezist",t, 0);
если кинуть на демку , то работает , возвращает значение , в данном случае тренд линии , но если запустить на тестере , то значение = 0 , где ошибка ? почему функция не работает на тестере ?
Документация по MQL5: Графические объекты / ObjectGetValueByTime
Документация по MQL5: Графические объекты / ObjectGetValueByTime
  • www.mql5.com
Графические объекты / ObjectGetValueByTime - Документация по MQL5
 
Invest777:

Привет всем !

у меня возникло 2 вопроса по функциям mql5 , первая касательно мультивалютного открытия ордеров (4 ордера по локу), вот код : 

 так вот в тестере открывает только первые 2 сделки , а вторую часть игнорирует , но почему ?

и второй вопрос касательно функции ObjectGetValueByTime: 

если кинуть на демку , то работает , возвращает значение , в данном случае тренд линии , но если запустить на тестере , то значение = 0 , где ошибка ? почему функция не работает на тестере ?

 

На счет остального не подскажу, в тестере вроде как графические объекты не работают. Это еще с четверки перешло, с целью увеличения быстродействия тестера, так что тестировать советники в тестрере построенные на графических объектах не получиться.
 
sergey1294:
На счет остального не подскажу, в тестере вроде как графические объекты не работают. Это еще с четверки перешло, с целью увеличения быстродействия тестера, так что тестировать советники в тестрере построенные на графических объектах не получиться.
спасибо за ответ , тогда ясно , а я сколько мозг парил , думал что сам нето ставлю , а дело то совсем в другом.
 
Invest777:

Привет всем !

 так вот в тестере открывает только первые 2 сделки , а вторую часть игнорирует , но почему ?

Согласно Вашему условию:

if(!PositionSelect(symbol))
     {
      ...
      OrderSend(mrequest,mresult);                      // отсылаем ордер
      Print("открыт buy, magic = ",magic);
     
     }

если позиция существует, то ордер не отсылается.

К тому же, в MT5 локи невозможны, второй  ордер просто закроет позицию.

 
Valmars:

Согласно Вашему условию:

если позиция существует, то ордер не отсылается.

К тому же, в MT5 локи невозможны, второй  ордер просто закроет позицию.


как же так ? а если стратегия предусматривает лок ? както несовсем логично получаеться
 
Invest777:
как же так ? а если стратегия предусматривает лок ? както несовсем логично получаеться
???
 
Invest777:
как же так ? а если стратегия предусматривает лок ? както несовсем логично получаеться

В мт5 лок = отсутствие позиции.

1.0 buy + 1.0 sell = 0 :)

 
Invest777:
как же так ? а если стратегия предусматривает лок ? както несовсем логично получаеться
В MQL5 предложено несколько вариантов обхода для таких стратегий через виртуальные ордера-позиции. Меня они не очень интерисуют. Можно посмотреть в поиске по форуму, но лучше, на мой взгляд, вообще отказаться от таких стратегий и перейти к неттингивой парадигме, где позиция по инструменту всегда одна и складывается из всех сделок, совершённых в период существования позиции.
 
Invest777:
как же так ? а если стратегия предусматривает лок ? както несовсем логично получаеться
МТ4 в помощь. Или как вариант подгоняйте стратегию под неттинг (локи только в положительной зоне и все такое)...
 
Invest777:
как же так ? а если стратегия предусматривает лок ? както несовсем логично получаеться

Ну если уж очень хочется - вот вам и грабли в руки:

Выстраивайте локирующие "карусели", типа EURUSD buy + USDJPY buy + EURJPY sell, и будет вам счастие в виде лока и геморроя с поддержкой оной конструкции :)

 
спасибо всем за ответы , буду чтото мудрить )