Советник торгующий инструментами имеющими в названии #

 

Все добрый день!

Писатель роботов пока из меня так себе, поэтому обращаюсь к профессионалам....

Ни как не могу понять как заставить робота торговать инструментами имеющими в названии  символа #... Например ‌#DJ30H7... или #GB100... и в таком духе... есть брокеры у которых CFD на акции начинается с #...

Робот у меня торгует разными инструментами одновременно, портфелем...  в начале задаю инструменты  в строке EXTERN STRING  X1 = "GBPUSD";‌ а потом в функции ордер сенд вместо символа ставлю просто X1 и все... на валюте работает безотказно.... но как только в названии попадается # то советник перестает видеть инструмент....

Может кто нибудь знает как сделать так чтобы заработало?....

СПАСИБО!‌

 
Castyell:

Все добрый день!

Писатель роботов пока из меня так себе, поэтому обращаюсь к профессионалам....

Ни как не могу понять как заставить робота торговать инструментами имеющими в названии  символа #... Например ‌#DJ30H7... или #GB100... и в таком духе... есть брокеры у которых CFD на акции начинается с #...

Робот у меня торгует разными инструментами одновременно, портфелем...  в начале задаю инструменты  в строке EXTERN STRING  X1 = "GBPUSD";‌ а потом в функции ордер сенд вместо символа ставлю просто X1 и все... на валюте работает безотказно.... но как только в названии попадается # то советник перестает видеть инструмент....

Может кто нибудь знает как сделать так чтобы заработало?....

СПАСИБО!‌

EXTERN STRING  X1 = "#DJ30H7";‌ 

Т‌ак пробовали?

 
Evgeny Belyaev:

EXTERN STRING  X1 = "#DJ30H7";‌ 

Т‌ак пробовали?

да, не видит инструмент...

ордер не открывает пишет что не правильно указан инструмент...

в самом коде робота есть строка где стоимость одного инструмента делится на стоимость другого, вот на эту строку тоже ругается что делить на ноль нельзя....‌

 
Castyell:

да, не видит инструмент...

ордер не открывает пишет что не правильно указан инструмент...

в самом коде робота есть строка где стоимость одного инструмента делится на стоимость другого, вот на эту строку тоже ругается что делить на ноль нельзя....‌


Если у вас деление на ноль , то советник завершит работу с критической ошибкой. Перед делением нужно проверить нет ли ноля в знаменателе. По всей видимости название инструмента тут не причем.
 
Evgeny Belyaev:

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

советник прекращает работать и выдает ошибку...  "zero divide in " и указывает  именно на цену инструмента... на ту строку и на тот знак, который отвечает за передачу цены, но так как он не может понять что за инструмент то возвращает 0... так и получается что ноль в знаменателе....

и при открытии ордера там где указывается символ пишу тоже что и выше ( в знаменателе ) и он ругается что неправильный инструмент... как только в строке  EXTERN STRING  X1 = "#DJ30H7";‌  меняю инструмент обратно на валюту или инструмент у которого в названии нет #, советник тут же начинает работать....
 

 
Castyell:

советник прекращает работать и выдает ошибку...  "zero divide in " и указывает  именно на цену инструмента... на ту строку и на тот знак, который отвечает за передачу цены, но так как он не может понять что за инструмент то возвращает 0... так и получается что ноль в знаменателе....

и при открытии ордера там где указывается символ пишу тоже что и выше ( в знаменателе ) и он ругается что неправильный инструмент... как только в строке  EXTERN STRING  X1 = "#DJ30H7";‌  меняю инструмент обратно на валюту или инструмент у которого в названии нет #, советник тут же начинает работать....
 


Сделайте скрипт.

Alert(Symbol());

Кинте на инструмент по которуму выдает ошибку. Посмотрите что выдает алерт.

 
Castyell:

да, не видит инструмент...

ордер не открывает пишет что не правильно указан инструмент...

в самом коде робота есть строка где стоимость одного инструмента делится на стоимость другого, вот на эту строку тоже ругается что делить на ноль нельзя....‌


В окне обзора рынка он есть? Если нет - добавьте.
 
Vitalie Postolache:

В окне обзора рынка он есть? Если нет - доб
Vitalie Postolache:

В окне обзора рынка он есть? Если нет - добавьте.

в обзоре рынка есть.... 


Сделайте скрипт.

Alert(Symbol());
Кинте на инструмент по которуму выдает ошибку. Посмотрите что выдает алерт.

‌сейчас попробую , спасибо

 
Castyell:
Алерт выдает #DJ30H7.... ни чего не понимаю...  Возможно такое что строка string не передает #... так как "стринг" это текстовая строка?
 
Castyell:
Алерт выдает #DJ30H7.... ни чего не понимаю...  Возможно такое что строка string не передает #... так как "стринг" это текстовая строка?

Выложите свой код на форуме. Пока ничего не ясно.
 
Evgeny Belyaev:

Выложите свой код на форуме. Пока ничего не ясно.

extern string x1 = "GBPJPY";
extern string x2 = "EURJPY";
extern string x3 = "USDJPY";
extern string x4 = "CHFJPY";
extern string x5 = "AUDJPY";

extern string x6 = "CADJPY";
extern string x7 = "NZDJPY";
extern string x8 = "SGDJPY";
extern string x9 = "TRYJPY";
extern string x10 = "SEKJPY";   // инструменты
extern double lot = 0.01;  //первичный лот
extern string period = PERIOD_H1;
extern double profit=150;
extern int magic1 = 1;
extern int x = 30;
extern double rsihigh =60;
extern double rsilow =30;

 string symbol1 ="";
 string symbol2 ="";
 string symbol3 ="";
 string symbol4 ="";
 string symbol5 ="";

 string symbol6 ="";
 string symbol7 ="";
 string symbol8 ="";
 string symbol9 ="";
 string symbol10 ="";



int magic2 = magic1 + 1;
int magic3 = magic1 + 2;
int magic4 = magic1 + 3;
int magic5 = magic1 + 4;
int magic6 = magic1 + 5;
int magic7 = magic1 + 6;
int magic8 = magic1 + 7;
int magic9 = magic1 + 8;
int magic10 = magic1 + 9;
 //rsi



extern bool CloseOnly = False;
extern string comment = " комментарий к сделкам";

static int prevtime=0;
static bool openbarspriceonly=true;

int total=OrdersTotal();
int t1 = -1;int t2 = -1;int t3 = -1;int t4 = -1;
int t5 = -1;int t6 = -1;int t7 = -1;int t8 = -1; int t9 = -1;
int t10 = -1;


double rsi1;
double rsi2;
double rsi3;
double rsi4;
double rsi5;
double rsi6;
double rsi7;
double rsi8;
double rsi9;
double rsi10;




//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   prevtime=Time[0];
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----

//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+

void OnTick()
  {
//----

   if (CountOrders()!=0) {Comment ("1.Общий профит = ",Profit(),
   "2. Цена первой карзины =",price1(),
   "3. Цена второй карзины =",price2(),
   "\\ текущее значение RSI ", x1,"=",rsi1,"\\\\",x2,"=",rsi2,"/////",x3,"=",rsi3,"/////",x4,"=",rsi4,"/////",x5,"=",rsi5 );}
    
    if(!IsTradeAllowed())
     {
      Comment("Режим автоторговли ВЫКЛЮЧЕН!!!");
      return;
     }
   
   prevtime=Time[0];
  
 if ((CountOrders()!=0)&&(Profit()>profit)) {close();} 
  

 if ((CountOrders()==0)&&!CloseOnly) { open(); return;}
 
 if(CloseOnly)
     {
      Comment("1.Режим ТОЛЬКО ЗАКРЫТИЕ!!! 2.Общий профит = ",Profit()
               );
      return;
     }
 
 return;
 
 
 }
 
double price1(){double price1 =(MarketInfo(symbol1,MODE_BID)+MarketInfo(symbol2,MODE_BID)+MarketInfo(symbol3,MODE_BID)+MarketInfo(symbol4,MODE_BID)+MarketInfo(symbol5,MODE_BID))/5; return(price1);}
double price2(){double price2 =(MarketInfo(symbol6,MODE_BID)+MarketInfo(symbol7,MODE_BID)+MarketInfo(symbol8,MODE_BID)+MarketInfo(symbol9,MODE_BID)+MarketInfo(symbol10,MODE_BID))/5; return(price2);}

double Profit()
{
double P = GetProfitOpenPosInCurrency("",-1,magic1)+GetProfitOpenPosInCurrency("",-1,magic2)+GetProfitOpenPosInCurrency("",-1,magic3)+GetProfitOpenPosInCurrency("",-1,magic4)+GetProfitOpenPosInCurrency("",-1,magic5)+GetProfitOpenPosInCurrency("",-1,magic6)+GetProfitOpenPosInCurrency("",-1,magic7)+GetProfitOpenPosInCurrency("",-1,magic8)+GetProfitOpenPosInCurrency("",-1,magic9)+GetProfitOpenPosInCurrency("",-1,magic10);

return(P);

}

int open()

  {
  
    rsi1 = iRSI(x1,period,x,0,0);
    rsi2 = iRSI(x2,period,x,0,0);
    rsi3 = iRSI(x3,period,x,0,0);
    rsi4 = iRSI(x4,period,x,0,0);
    rsi5 = iRSI(x5,period,x,0,0);
    rsi6 = iRSI(x6,period,x,0,0);
    rsi7 = iRSI(x7,period,x,0,0);
    rsi8 = iRSI(x8,period,x,0,0);
    rsi9 = iRSI(x9,period,x,0,0);
    rsi10 = iRSI(x10,period,x,0,0);
  
  
   double karz1 = (rsi1+rsi2+rsi3+rsi4+rsi5)/5;
   double karz2 = (rsi6+rsi7+rsi8+rsi9+rsi10)/5;
  

 
   if (rsi1>rsihigh){symbol1 = x1;} else if(rsi1<rsilow) {symbol6 = x1;} else if(rsi1 >rsilow&&rsi1 <rsihigh){Comment(x1,"не определен в карзину, ждем");}
   if (rsi2>rsihigh){symbol2 = x2;} else if(rsi2<rsilow) {symbol7 = x2;} else if(rsi2 >rsilow&&rsi2 <rsihigh){Comment(x2,"не определен в карзину, ждем");}
   if (rsi3>rsihigh){symbol3 = x3;} else if(rsi3<rsilow) {symbol8 = x3;} else if(rsi3 >rsilow&&rsi3 <rsihigh){Comment(x3,"не определен в карзину, ждем");}
   if (rsi4>rsihigh){symbol4 = x4;} else if(rsi4<rsilow) {symbol9 = x4;} else if(rsi4 >rsilow&&rsi4 <rsihigh){Comment(x4,"не определен в карзину, ждем");}
   if (rsi5>rsihigh){symbol5 = x5;} else if(rsi5<rsilow) {symbol10 = x5;} else if(rsi5 >rsilow&&rsi5 <rsihigh){Comment(x5,"не определен в карзину, ждем");}
    
    if (symbol1 == x1){symbol6 = x6;} else if((symbol6 == x1)){symbol1 =x6;} else if (symbol1 != x1 && symbol6 != x1){Comment(x1,x6,"не определены в карзины,  ждем");}
    if (symbol2 == x2){symbol7 = x7;} else if((symbol7 == x2)){symbol2 =x7;} else if (symbol2 != x2 && symbol7 != x2){Comment(x2,x7,"не определены в карзины,  ждем");}
    if (symbol3 == x3){symbol8 = x8;} else if((symbol8 == x3)){symbol3 =x8;} else if (symbol3 != x3 && symbol8 != x3){Comment(x3,x8,"не определены в карзины,  ждем");}
    if (symbol4 == x4){symbol9 = x9;} else if((symbol9 == x4)){symbol4 =x9;} else if (symbol4 != x4 && symbol9 != x4){Comment(x4,x9,"не определены в карзины,  ждем");}
    if (symbol5 == x5){symbol10 = x10;} else if((symbol10 == x5)){symbol5 = x10;} else if (symbol5 != x5 && symbol10 != x10){Comment(x5,x10,"не определены в карзины,  ждем");}
    
    
double klot2 = (MarketInfo(x1,MODE_BID)/MarketInfo(symbol2,MODE_BID));
double klot3 = (MarketInfo(x1,MODE_BID)/MarketInfo(symbol3,MODE_BID));
double klot4 = (MarketInfo(x1,MODE_BID)/MarketInfo(symbol4,MODE_BID));
double klot5 = (MarketInfo(x1,MODE_BID)/MarketInfo(symbol5,MODE_BID));
double klot6 = (MarketInfo(x1,MODE_BID)/MarketInfo(symbol6,MODE_BID));
double klot7 = (MarketInfo(x1,MODE_BID)/MarketInfo(symbol7,MODE_BID));
double klot8 = (MarketInfo(x1,MODE_BID)/MarketInfo(symbol8,MODE_BID));
double klot9 = (MarketInfo(x1,MODE_BID)/MarketInfo(symbol9,MODE_BID));
double klot10 = (MarketInfo(x1,MODE_BID)/MarketInfo(symbol10,MODE_BID));
 
    
     if ((CountOrders()==0)&&!CloseOnly)
          {  if (symbol1 != "" && symbol2 != "" && symbol3 != "" && symbol4 != "" && symbol5 != "" && symbol6 != "" && symbol7 != "" && symbol8 != "" && symbol9 != "" && symbol10 != ""){
//_______________________________________________________________________________         
                 if (rsi1>rsihigh)// 1 карзина рса больше 70 и больше чем у карзины 2
                   {
                    t1 = OrderSend(symbol1,OP_SELL,lot,MarketInfo(symbol1,MODE_BID),3,0,0,"1_1",magic1,0,Red);
                    t2 = OrderSend(symbol2,OP_SELL,lot*klot2,MarketInfo(symbol2,MODE_BID),3,0,0,"1_2",magic2,0,Red);
                    t3 = OrderSend(symbol3,OP_SELL,lot*klot3,MarketInfo(symbol3,MODE_BID),3,0,0,"1_3",magic3,0,Red);
                    t4 = OrderSend(symbol4,OP_SELL,lot*klot4,MarketInfo(symbol4,MODE_BID),3,0,0,"1_4",magic4,0,Red);
                    t5 = OrderSend(symbol5,OP_SELL,lot*klot5,MarketInfo(symbol5,MODE_BID),3,0,0,"1_5",magic5,0,Red);
                    // 2 карзина
                    t6 = OrderSend(symbol6,OP_BUY,lot*klot6,MarketInfo(symbol6,MODE_ASK),3,0,0,"2_1",magic6,0,Red);
                    t7 = OrderSend(symbol7,OP_BUY,lot*klot7,MarketInfo(symbol7,MODE_ASK),3,0,0,"2_2",magic7,0,Red);
                    t8 = OrderSend(symbol8,OP_BUY,lot*klot8,MarketInfo(symbol8,MODE_ASK),3,0,0,"2_3",magic8,0,Red);
                    t9 = OrderSend(symbol9,OP_BUY,lot*klot9,MarketInfo(symbol9,MODE_ASK),3,0,0,"2_4",magic9,0,Red);
                    t10 = OrderSend(symbol10,OP_BUY,lot*klot10,MarketInfo(symbol10,MODE_ASK),3,0,0,"2_5",magic10,0,Red);
                  
                   }
//_______________________________________________________________________________         
              
                  else if(rsi1<rsilow)
                   {
                    t1 = OrderSend(symbol1,OP_BUY,lot,MarketInfo(symbol1,MODE_ASK),3,0,0,"1 карзина"+comment,magic1,0,Red);
                    t2 = OrderSend(symbol2,OP_BUY,lot*klot2,MarketInfo(symbol2,MODE_ASK),3,0,0,"1 карзина"+comment,magic2,0,Red);
                    t3 = OrderSend(symbol3,OP_BUY,lot*klot3,MarketInfo(symbol3,MODE_ASK),3,0,0,"1 карзина"+comment,magic3,0,Red);
                    t4 = OrderSend(symbol4,OP_BUY,lot*klot4,MarketInfo(symbol4,MODE_ASK),3,0,0,"1 карзина"+comment,magic4,0,Red);
                    t5 = OrderSend(symbol5,OP_BUY,lot*klot5,MarketInfo(symbol5,MODE_ASK),3,0,0,"1 карзина"+comment,magic5,0,Red);
                    // 2 карзина
                    t6 = OrderSend(symbol6,OP_SELL,lot*klot6,MarketInfo(symbol6,MODE_BID),3,0,0,"2 карзина"+comment,magic6,0,Red);
                    t7 = OrderSend(symbol7,OP_SELL,lot*klot7,MarketInfo(symbol7,MODE_BID),3,0,0,"2 карзина"+comment,magic7,0,Red);
                    t8 = OrderSend(symbol8,OP_SELL,lot*klot8,MarketInfo(symbol8,MODE_BID),3,0,0,"2 карзина"+comment,magic8,0,Red);
                    t9 = OrderSend(symbol9,OP_SELL,lot*klot9,MarketInfo(symbol9,MODE_BID),3,0,0,"2 карзина"+comment,magic9,0,Red);
                    t10 = OrderSend(symbol10,OP_SELL,lot*klot10,MarketInfo(symbol10,MODE_BID),3,0,0,"2  карзина"+comment,magic10,0,Red);
                    } 
                  }
                 
          }
  }
//+------------------------------------------------------------------+
int close(){closebuy();closesell();return(0);}


int closesell()   // Функция закрытия всех селлов

   {
   double G_slippage_84 = 3;
   int datetime_12;
   int error_16;
   int order_total_4 = OrdersTotal();
   if (order_total_4 > 0) {
      for (int pos_0 = order_total_4 - 1; pos_0 >= 0; pos_0--) {
         if (OrderSelect(pos_0, SELECT_BY_POS, MODE_TRADES)) {
            if ((OrderType() == OP_SELL)&&(OrderMagicNumber()==magic1 || OrderMagicNumber()==magic2 || OrderMagicNumber()==magic3 || OrderMagicNumber()==magic4 || OrderMagicNumber()==magic5 || OrderMagicNumber()==magic6 || OrderMagicNumber()==magic7 || OrderMagicNumber()==magic8 || OrderMagicNumber()==magic9 || OrderMagicNumber()==magic10)) {
               while (IsTradeContextBusy()) Sleep(1000);
               datetime_12 = TimeCurrent();
               RefreshRates();
               for (int is_closed_8 = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), G_slippage_84, Yellow); (!is_closed_8) && TimeCurrent() - datetime_12 <= 120 &&
                  !IsTesting(); is_closed_8 = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), G_slippage_84, Yellow)) {
                  Sleep(1000);
                  while (IsTradeContextBusy()) Sleep(500);
                  RefreshRates();
               }
               if (!is_closed_8) {
                  error_16 = GetLastError();
                  Print("Ошибка закрытия ордера SELL #" + OrderTicket() + " " );
               }
            }
         } else Print("Не удалось выбрать открытый ордер:");
      }
   }
}
//+------------------------------------------------------------------+


int closebuy()
 {
   double G_slippage_84 = 3;
   int datetime_12;
   int error_16;
   int order_total_4 = OrdersTotal();
   if (order_total_4 > 0) {
      for (int pos_0 = order_total_4 - 1; pos_0 >= 0; pos_0--) {
         if (OrderSelect(pos_0, SELECT_BY_POS, MODE_TRADES)) {
            if ((OrderType() == OP_BUY)&&(OrderMagicNumber()==magic1 || OrderMagicNumber()==magic2 || OrderMagicNumber()==magic3 || OrderMagicNumber()==magic4 || OrderMagicNumber()==magic5 || OrderMagicNumber()==magic6 || OrderMagicNumber()==magic7 || OrderMagicNumber()==magic8 || OrderMagicNumber()==magic9 || OrderMagicNumber()==magic10)) {
               while (IsTradeContextBusy()) Sleep(1000);
               datetime_12 = TimeCurrent();
               RefreshRates();
               for (int is_closed_8 = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), G_slippage_84, Yellow); (!is_closed_8) && TimeCurrent() - datetime_12 <= 120 &&
                  !IsTesting(); is_closed_8 = OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), G_slippage_84, Yellow)) {
                  Sleep(1000);
                  while (IsTradeContextBusy()) Sleep(1000);
                  RefreshRates();
               }
               if (!is_closed_8) {
                  error_16 = GetLastError();
                  Print("Ошибка закрытия ордера BUY #" + OrderTicket() + " " );
               }
            }
         } else Print("Не удалось выбрать открытый ордер:");
      }
   }
}

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int CountOrders()
  {
   int result=0;
   for(int k=0; k<OrdersTotal(); k++)
     {
      if(OrderSelect(k,SELECT_BY_POS,MODE_TRADES)==true)
        {
         if(OrderMagicNumber()==magic1 || OrderMagicNumber()==magic2 || OrderMagicNumber()==magic3 || OrderMagicNumber()==magic4 || OrderMagicNumber()==magic5 || OrderMagicNumber()==magic6 || OrderMagicNumber()==magic7 || OrderMagicNumber()==magic8 || OrderMagicNumber()==magic9 || OrderMagicNumber()==magic10)
           {result++;}
         else
           {}
           }
        }
      return(result);
     }
//+------------------------------------------------------------------+

//------------- Возвращает суммарный профит открытых позиций в валюте депозита -----------------+
//===============================================================================================


double GetProfitOpenPosInCurrency(string sy="", int op=-1, int mn=-1) {
  double p=0;
  int    i, k=OrdersTotal();

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if ((OrderSymbol()==sy || sy=="") && (op<0 || OrderType()==op)) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (mn<0 || OrderMagicNumber()==mn) {
            p+=OrderProfit()+OrderCommission()+OrderSwap();
          }
        }
      }
    }
  }
  return(p);
}

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

заранее прошу прощения за то что написано странно... )))

Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок
Документация по MQL5: Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок
  • www.mql5.com
Стандартные константы, перечисления и структуры / Торговые константы / Свойства сделок - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
Причина обращения: