не работает индикатор в mt4 - страница 4

 
Sergey Golubev #:
Я нашел по поиску этот индикатор (в посте тут ), скомпиллировал его в МТ4, было без ошибок, и он в аттаче (с тем же именем).


вот же ссылка на интересующий меня советник

https://www.mql5.com/ru/code/36897?utm_campaign=codebase.list&utm_medium=special&utm_source=mt4terminal

Triangular Arbitration - эксперт для MetaTrader 4

точно такая же ошибка выходит. как и в посте #14

он у меня не работает на реальном счету


//+--------------------------------------------------------------------------------+
//| Советник, выставляет 3 позиции по 3м валютам если по ним нет открытых позиций. |
//|                                       Copyright © 2013-2021, Khlistov Vladimir |
//|                                                       http://cmillion.narod.ru |
//+--------------------------------------------------------------------------------+
#property copyright "Copyright © 2021, Khlistov Vladimir"
#property link      "http://cmillion.ru"
#property version   "1.0"
#property strict
#property description "Советник торгует по 3м инструментам по системе треугольник. Страхует риск одной позиции за счет двух других. https://cmillion.ru/sovetnik-cm_ea_hedge/"
#property description "The Expert Advisor trades on 3 instruments using the triangle system. Insures the risk of one position at the expense of the other two."
//+------------------------------------------------------------------+
extern string  SYMBOL1        = "GBPUSD";
extern string  SYMBOL2        = "USDJPY";
extern string  SYMBOL3        = "GBPJPY";
extern double  LOT1           = 0.1;
extern double  LOT2           = 0.1;
extern double  LOT3           = 0.1;
extern int     TYPE1          = OP_BUY;
extern int     TYPE2          = OP_BUY;
extern int     TYPE3          = OP_SELL;
extern int     Magic          = 777888;
extern double  ProfitClose    = 1.0;
//+------------------------------------------------------------------+
string AC;
int OnInit()
{
   EventSetTimer(1);
   AC=AccountCurrency();
   return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
void OnTick() {OnTimer();}
void OnTimer()
{
   if (IsTesting())
   {
      if (OrdersTotal()==0) if (OrderSend(Symbol(),OP_BUY,SymbolInfoDouble(Symbol(),SYMBOL_VOLUME_MIN),Ask,1000,0,0,"Hedge 3",Magic,0,clrNONE)==-1)
         Print("Error open ",LOT1," ", SYMBOL1);
      return;
   }
   string Sym;
   int    i;
   double profit=0;
   double profit1=0;
   double profit2=0;
   double profit3=0;
   bool open1=false;
   bool open2=false;
   bool open3=false;
   for (i=0; i<OrdersTotal(); i++)
   {    
      if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
      {
         if (Magic!=OrderMagicNumber()) continue;
         Sym = OrderSymbol();
         if (Sym!=SYMBOL1 && Sym!=SYMBOL2 && Sym!=SYMBOL3) continue;
         profit=OrderProfit()+OrderSwap()+OrderCommission();
         if (Sym==SYMBOL1) {open1=true;profit1+=profit;}
         if (Sym==SYMBOL2) {open2=true;profit2+=profit;}
         if (Sym==SYMBOL3) {open3=true;profit3+=profit;}
      }
   }
  
   //---
  
   profit=profit1+profit2+profit3;
  
   //---
  
   if (profit>=ProfitClose)
   {
      for (i = OrdersTotal()-1; i >= 0; i--)
      {
         if (OrderSelect(i, SELECT_BY_POS))
         {
            if (Magic!=OrderMagicNumber()) continue;
            Sym = OrderSymbol();
            if (Sym!=SYMBOL1 && Sym!=SYMBOL2 && Sym!=SYMBOL3) continue;
            if (!OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(Sym,OrderType()==OP_BUY?MODE_BID:MODE_ASK),(int)MarketInfo(Sym,MODE_DIGITS)),1000,clrNONE))
            Print("Error close ",Sym);
         }
      }
   }
  
   Comment(TimeCurrent(),"\n",SYMBOL1," ",DoubleToString(profit1,2)," ",AC,
                         "\n",SYMBOL2," ",DoubleToString(profit2,2)," ",AC,
                         "\n",SYMBOL3," ",DoubleToString(profit3,2)," ",AC,
                         "\nprofit =",DoubleToString(profit,2)," ",AC);
   //---
  
   if (!open1)
   {
      if (OrderSend(SYMBOL1,TYPE1,LOT1,NormalizeDouble(MarketInfo(SYMBOL1,TYPE1==OP_BUY?MODE_BID:MODE_ASK),
      (int)MarketInfo(SYMBOL1,MODE_DIGITS)),1000,0,0,"Hedge 3",Magic,0,clrNONE)==-1)
         Print("Error open ",LOT1," ", SYMBOL1);
   }
   if (!open2)
   {
      if (OrderSend(SYMBOL2,TYPE2,LOT2,NormalizeDouble(MarketInfo(SYMBOL2,TYPE2==OP_BUY?MODE_BID:MODE_ASK),
      (int)MarketInfo(SYMBOL2,MODE_DIGITS)),1000,0,0,"Hedge 3",Magic,0,clrNONE)==-1)
         Print("Error open ",LOT2," ", SYMBOL2);
   }
   if (!open3)
   {
      if (OrderSend(SYMBOL3,TYPE3,LOT3,NormalizeDouble(MarketInfo(SYMBOL3,TYPE3==OP_BUY?MODE_BID:MODE_ASK),
      (int)MarketInfo(SYMBOL3,MODE_DIGITS)),1000,0,0,"Hedge 3",Magic,0,clrNONE)==-1)
         Print("Error open ",LOT3," ", SYMBOL3);
   }
}
//--------------------------------------------------------------------
Triangular Arbitration
Triangular Arbitration
  • www.mql5.com
Tреугольный арбиртаж - торговля по трем валютным парам.
 
Dinara Ti #:


вот же ссылка на интересующий меня советник

А почему вам не задать вопрос разработчику этого индикатора? Вот ведь тема обсуждения

Советники: Triangular Arbitration - Сделка покупки-продажи акций Газпрома - торговля активом между двумя рынками
Советники: Triangular Arbitration - Сделка покупки-продажи акций Газпрома - торговля активом между двумя рынками
  • 2021.10.21
  • www.mql5.com
Деньги доставляются в регион и раздаются скупщиками акций. наконец получив давно купленные акции на счет своей компании. обязан подать оферту Газпрому с предложением купить мои акции по такой-то цене. требуя доплатить ему за акции, которые подорожали с момента продажи
 
Alexey Viktorov #:

А почему вам не задать вопрос разработчику этого индикатора? Вот ведь тема обсуждения

я спрашивала, вчера, в тележке... он говорит должно работать, все открыто, но у меня не работает на рельном счету. В Демо идет, а на реальном - нет
 
Dinara Ti #:
я спрашивала, вчера, в тележке... он говорит должно работать, все открыто, но у меня не работает на рельном счету. В Демо идет, а на реальном - нет
Что в журнале пишет?
 
Vitaly Murlenko #:
Что в журнале пишет?

за 13 число во вкладке Эксперты:

ошибки cannot open file ...путь... [2]

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

Error open... lot1... symbol1

Error open... lot2... symbol2

Error open... lot3... symbol3

вместо lot и symbol указанные значения

в коде это ошибка при отрытии, последние строчки кода

 

ЫЫЫ, дык ошибки в функции OrderSend()

Переменная TYPE1 проинициализирована значением  = OP_BUY; В блоке "if (!open1)" имеем конструкцию:

OrderSend(SYMBOL1,TYPE1,LOT1,NormalizeDouble(MarketInfo(SYMBOL1,TYPE1==OP_BUY ? MODE_BID : MODE_ASK),
      (int)MarketInfo(SYMBOL1,MODE_DIGITS)),1000,0,0,"Hedge 3",Magic,0,clrNONE)

Иными словами, отдаётся приказ на открытие Бай-ордера. При формировании цены открытия лонга имеем конструкцию:

NormalizeDouble(MarketInfo(SYMBOL1,TYPE1==OP_BUY ? MODE_BID : MODE_ASK),
      (int)MarketInfo(SYMBOL1,MODE_DIGITS)

При переводе на русский язык тут написано: "Взять цену Бид, нормализовать до дигетса". Дело в том, что Бай ордера открываются по цене Аск. Чтоб было правильно, конструкцию нужно изменить на:

NormalizeDouble(MarketInfo(SYMBOL1,TYPE1==OP_BUY ? MODE_ASK : MODE_BID),
      (int)MarketInfo(SYMBOL1,MODE_DIGITS))

Понимаете в чём дело, если у Вас в тестере выставлены параметры, при которых спред = 0, то в этом случае Бид = Аску и ордер встанет при даже неправильно-написанной конструкции. Но вполне возможно, что у Вас на реальном счёте спред не нулевой. Поэтому, по идее, советник должен Вам в журнал выдать ошибку, по-моему,  130.

Блоки кода open2 и open3 содержат ту же самую опечатку TYPE2==OP_BUY ? MODE_BID : MODE_ASK - если тип ордера - Бай, то взять цену Бид, иначе взять цену Аск. А должно быть наоборот, если тип ордера Бай, то взять цену Аск, иначе взять цену Бид.

 

Правильно вот так (Замените у себя этот участок кода):

if (!open1)
   {
      if (OrderSend(SYMBOL1,TYPE1,LOT1,NormalizeDouble(MarketInfo(SYMBOL1,TYPE1==OP_BUY ? MODE_ASK : MODE_BID),
      (int)MarketInfo(SYMBOL1,MODE_DIGITS)),1000,0,0,"Hedge 3",Magic,0,clrNONE)==-1)
         Print("Error open ",LOT1," ", SYMBOL1);
   }
   if (!open2)
   {
      if (OrderSend(SYMBOL2,TYPE2,LOT2,NormalizeDouble(MarketInfo(SYMBOL2,TYPE2==OP_BUY ? MODE_ASK : MODE_BID),
      (int)MarketInfo(SYMBOL2,MODE_DIGITS)),1000,0,0,"Hedge 3",Magic,0,clrNONE)==-1)
         Print("Error open ",LOT2," ", SYMBOL2);
   }
   if (!open3)
   {
      if (OrderSend(SYMBOL3,TYPE3,LOT3,NormalizeDouble(MarketInfo(SYMBOL3,TYPE3==OP_BUY ? MODE_ASK : MODE_BID),
      (int)MarketInfo(SYMBOL3,MODE_DIGITS)),1000,0,0,"Hedge 3",Magic,0,clrNONE)==-1)
         Print("Error open ",LOT3," ", SYMBOL3);
   }
 
Vitaly Murlenko #:

Правильно вот так (Замените у себя этот участок кода):

оооо... заработало... Низкий поклон тебе, добрый человек!!! *ура*

я так поняла, Вы просто поменяли Mode_Ask и Mode_Bid местами

я передам создателю об этой тонкости

Еще раз спасибо

 
Что-то я не врубаюсь в логику запуска этого кода. Если есть событие ontimer(), то начёрта запускать его на каждом тике? Или может я чего-то не знаю?
 
Vitaly Murlenko #:
Что-то я не врубаюсь в логику запуска этого кода. Если есть событие ontimer(), то начёрта запускать его на каждом тике? Или может я чего-то не знаю?
система такая: он просто открывает эти 3 пары, ждем профита, позиции закрываются, и открываются снова. Нет никакой стратегии. Просто эти 3 пары перекрывают +/- друг друга. Главное, найти нужный треугольник. Мне этого достаточно
Причина обращения: