Скачать MetaTrader 5

Советник отказывается работать

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Ivan Ovchinnikov
1153
Ivan Ovchinnikov 2015.11.12 21:43 

Советник отказывается работать у брокера, потому что в символе присутствует _e (например EURUSD_e).

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

Vitaly Muzichenko
3850
Vitaly Muzichenko 2015.11.13 02:16  

Обрезать лишнее: 

StringSubstr 

StringSubstr - Документация на MQL4
  • docs.mql4.com
StringSubstr - Документация на MQL4
Vitalii Ananev
8418
Vitalii Ananev 2015.11.13 05:27  
Ivan Ovchinnikov:

Советник отказывается работать у брокера, потому что в символе присутствует _e (например EURUSD_e).

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

Используйте функция Symbol(), которая возвращает имя символа текущего графика
Alexey Busygin
6449
Alexey Busygin 2015.11.13 05:42  
Ivan Ovchinnikov:

Советник отказывается работать у брокера, потому что в символе присутствует _e (например EURUSD_e).

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

Поменяйте брокера
Vladimir Karputov
Модератор
49444
Vladimir Karputov 2015.11.13 06:15  
Ivan Ovchinnikov:

Советник отказывается работать у брокера, потому что в символе присутствует _e (например EURUSD_e).

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

Чтобы подсказать, нужно увидеть сам код.

Alexey Busygin
6449
Alexey Busygin 2015.11.13 06:20  
Karputov Vladimir:

Чтобы подсказать, нужно увидеть сам код.

Кода наверно, у него нет.
Ivan Ovchinnikov
1153
Ivan Ovchinnikov 2015.11.13 08:06  
Karputov Vladimir:

Чтобы подсказать, нужно увидеть сам код.

вот код

//+------------------------------------------------------------------+
//|                                                      ProjectName |
//|                                      Copyright 2012, CompanyName |
//|                                       http://www.companyname.net |
//+------------------------------------------------------------------+
extern double MaxDD          = 30;
extern double MM             = 30;

extern string PipeName       = "SA_600";
extern string ServerPairName = "";
extern double BidCorrection  = 0;
extern double AskCorrection  = 0;

extern int    ActionPips     = 2;
extern int    TargetPips     = 5;
extern int    StopPips       = 15;
extern int    VirtualStops   = false;

extern int    ConfirmMS     = 20;
extern int    SleepMS       = 20;
extern int    Slippage      = 1;
extern int    Magic         = 2013;


#define PIPE_BASE_NAME     "\\\\.\\pipe\\mt4-"     // MUST tally with client code
#define ERROR_MORE_DATA 234

#import "kernel32.dll"
int CallNamedPipeW(string pipeName,uchar &outBuffer[],int outBufferSz,uchar &inBuffer[],int inBufferSz,int &bytesRead[],int timeOut);
#import


datetime StartTime=0;
double   MinLots=0.1;
double   MaxLots=0.1;
double   LotStep=0.1;
double   MyPoint=0.0001;

string   MasterPair="";
double   MaxBalance=0;
double   TotalPips=0;
int      TotalTrades=0;
double   EntrySlippage=0;
int      EntryMS=0;
int      OpenErrors=0;

int      LastTicket=0;
double   MasterBid=0;
double   MasterAsk=0;

string   LastQ="";
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int init()
  {
   Comment("Initialization ...");
   if(StringLen(ServerPairName)>=1)
      MasterPair=ServerPairName;
   else
      MasterPair=Symbol();

   StartTime=0;
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int deinit()
  {
   Comment("");
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {
   double CurrentPips=0;
   string sInfo="";
   if(IsStopped() || !IsConnected())
      return(0);

   if(Digits<=3)
      MyPoint=0.01;
   MinLots=MarketInfo(Symbol(),MODE_MINLOT);
   MaxLots=MarketInfo(Symbol(),MODE_MAXLOT);
   LotStep=MarketInfo(Symbol(),MODE_LOTSTEP);

   if(StartTime<=0)
     {
      MaxBalance=AccountBalance();
      StartTime=TimeLocal();
      TotalPips=0;
      EntrySlippage=0;
      TotalTrades=0;
      EntryMS=0;
      LastTicket=0;
      OpenErrors=0;
     }

   while(!IsStopped())
     {
      RefreshRates();
      double dBid=Bid;
      double dAsk=Ask;
      int OldTicket=LastTicket;
      LastTicket=0;
      for(int j=OrdersTotal()-1; j>=0; j--)
         if(OrderSelect(j,SELECT_BY_POS,MODE_TRADES))
            if((OrderSymbol()==Symbol()) && (OrderMagicNumber()==Magic))
              {
               if(OrderType()==OP_BUY)
                  CurrentPips=dBid-OrderOpenPrice();
               else
                  CurrentPips=OrderOpenPrice()-dAsk;
               CurrentPips=CurrentPips/MyPoint;
               LastTicket=OrderTicket();
               if((CurrentPips>=TargetPips || CurrentPips<=-StopPips) && IsTradeContextBusy()==false)
                 {
                  if(OrderType()==OP_BUY)
                     OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(dBid,Digits),Slippage*MyPoint/Point,Blue);
                  else
                     OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(dAsk,Digits),Slippage*MyPoint/Point,Red);
                 }
               else
               if(VirtualStops==false && OrderStopLoss()<Point && IsTradeContextBusy()==false)
                 {
                  double MinDistance=MarketInfo(Symbol(),MODE_STOPLEVEL)*Point+MyPoint;
                  if(OrderType()==OP_BUY)
                     OrderModify(OrderTicket(),OrderOpenPrice()
                                 ,MathMin(OrderOpenPrice()-StopPips*MyPoint,dBid-MinDistance)
                                 ,MathMax(OrderOpenPrice()+TargetPips*MyPoint,dAsk+MinDistance),0);
                  else
                     OrderModify(OrderTicket(),OrderOpenPrice()
                                 ,MathMax(OrderOpenPrice()+StopPips*MyPoint,dAsk+MinDistance)
                                 ,MathMin(OrderOpenPrice()-TargetPips*MyPoint,dBid-MinDistance),0);
                 }

              }

      if(LastTicket==0 && OldTicket>0)
         if(OrderSelect(OldTicket,SELECT_BY_TICKET,MODE_HISTORY))
           {
            if(OrderType()==OP_BUY)
               TotalPips=TotalPips+(OrderClosePrice()-OrderOpenPrice())/MyPoint;
            else
               TotalPips=TotalPips+(OrderOpenPrice()-OrderClosePrice())/MyPoint;
           }

      MaxBalance=MathMax(MaxBalance,AccountBalance());
      if(AccountBalance()<=0)
         break;
      sInfo="";
      CheckMaster();
      if(MaxDD<=100*(MaxBalance-AccountBalance())/MaxBalance)
         sInfo=sInfo+"\nMaximum Drawdawn Reached !!!";
      else
      if(MasterBid>=Point && MasterAsk>=Point)
                    sInfo=sInfo+"\nBuy/Sell Levels: "+DoubleToStr((MasterBid-dAsk)/MyPoint-ActionPips,1)+" / "+DoubleToStr((dBid-MasterAsk)/MyPoint-ActionPips,1)+" pips";
      else
      if(StringLen(LastQ)>0)
         sInfo=sInfo+"\nServer: "+LastQ;
      else
         sInfo=sInfo+"\nServer not working !!!";

      if(LastTicket>0)
         sInfo=sInfo+", Position: "+DoubleToStr(CurrentPips,1)+" pips";
      else
      if(MasterBid>=Point && MasterAsk>=Point && MaxDD>100*(MaxBalance-AccountBalance())/MaxBalance)
        {
         int Oper=-1;
         if((MasterBid-dAsk)/MyPoint>=ActionPips)
            Oper=OP_BUY;
         else
         if((dBid-MasterAsk)/MyPoint>=ActionPips)
                                      Oper=OP_SELL;
         if(Oper!=-1 && ConfirmMS>0)
           {
            Sleep(ConfirmMS);
            RefreshRates();
            dBid=Bid;
            dAsk=Ask;
            CheckMaster();
            if(Oper==OP_BUY && (MasterBid-dAsk)/MyPoint<ActionPips)
               Oper=-1;
            if(Oper==OP_SELL && (dBid-MasterAsk)/MyPoint<ActionPips)
               Oper=-1;
           }
         if(Oper!=-1 && IsTradeContextBusy()==false)
           {
            double Lots=MathMax(MinLots,MathMin(MaxLots,MathCeil((MM/100)*AccountFreeMargin()/LotStep/(100000/100))*LotStep));
            int ExecutionTime=GetTickCount();
            if(Oper==OP_BUY)
               LastTicket=OrderSend(Symbol(),OP_BUY,Lots,NormalizeDouble(dAsk,Digits),Slippage*MyPoint/Point,0,0,"",Magic,0,Blue);
            else
               LastTicket=OrderSend(Symbol(), OP_SELL, Lots, NormalizeDouble(dBid,Digits), Slippage*MyPoint/Point, 0, 0, "", Magic,0,Red);
            ExecutionTime=GetTickCount()-ExecutionTime;
            if(LastTicket<0)
              {
               OpenErrors=OpenErrors+1;
              }
            else
              {
               TotalTrades=TotalTrades+1;
               EntryMS=EntryMS+ExecutionTime;
               if(OrderSelect(LastTicket,SELECT_BY_TICKET))
                  if(OrderType()==OP_BUY)
                     EntrySlippage=EntrySlippage+(dAsk-OrderOpenPrice())/MyPoint;
               else
                  EntrySlippage=EntrySlippage+(OrderOpenPrice()-dBid)/MyPoint;
              }
           }
        }

      Comment("\nMagic# "+DoubleToStr(Magic,0)+", MM "+DoubleToStr(MM,2)+", Max DD: "+DoubleToStr(MaxDD,1)+"%, Current Drawdawn: "+DoubleToStr(100*(MaxBalance-AccountBalance())/MaxBalance,1)+" %"+
              "\nMin Lot "+DoubleToStr(MinLots,2)+", Max Lot "+DoubleToStr(MaxLots,2)+", Lot Step "+DoubleToStr(LotStep,2)+", Stop Level "+DoubleToStr(MarketInfo(Symbol(),MODE_STOPLEVEL)*Point/MyPoint,1)+" pips"+
              "\n"+sInfo+
              "\nStart Time: "+TimeToStr(StartTime,TIME_DATE|TIME_SECONDS)+
              "\nLocal Time: "+TimeToStr(TimeLocal(),TIME_DATE|TIME_SECONDS)+
              "\nTotal Pips: "+DoubleToStr(TotalPips,1)+
              "\nTotal Trades: "+DoubleToStr(TotalTrades,0)+
              "\nEntry Errors: "+DoubleToStr(OpenErrors,0)+
              "\nOpen Slippage: "+DoubleToStr(EntrySlippage,1)+" pips"+
              "\nAverage Speed: "+DoubleToStr(EntryMS/MathMax(TotalTrades,1),0)+" ms"+
              "\nAverage Slippage: "+DoubleToStr(EntrySlippage/MathMax(TotalTrades,1),1)+" pips"
              );
      Sleep(MathMax(SleepMS,10));
      if(IsTesting())
         break;
     }
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void CheckMaster()
  {
   MasterBid=0;
   MasterAsk=0;
   LastQ="";
   if(IsTesting())
     {
      MasterBid=NormalizeDouble(MarketInfo(MasterPair,MODE_BID)/2+MarketInfo(MasterPair,MODE_ASK)/2-MyPoint+2*MyPoint*(MathRand()-32767/2)/(32767/6),Digits);
      MasterAsk=MasterBid+2*MyPoint;
     }
   else
     {
      string MyPipeName = PIPE_BASE_NAME+PipeName;
      string extMessage = MasterPair;
      uchar   aextMessage[2048];
      uchar inBuffer[2048];
      int bytesRead[1];
      StringToCharArray(extMessage,aextMessage);
      bool fSuccess = CallNamedPipeW(MyPipeName,aextMessage,StringLen(extMessage)+1,inBuffer,ArraySize(inBuffer),bytesRead,0) != 0;
      int lastError = GetLastError();
      if(fSuccess/* || lastError == ERROR_MORE_DATA*/)
        {
         string inString="";
         for(int i=0; i<bytesRead[0]; i++)
            inString=inString+CharToStr(inBuffer[i]);
         int ai=StringFind(inString,"|",0);
         if(ai>0)
           {
            MasterBid=StrToDouble(StringSubstr(inString, 0, ai));
            MasterAsk=StrToDouble(StringSubstr(inString, ai+1));
           }
         LastQ=inString;
        }
     }
   if(MasterBid>0.0001)
      MasterBid=MasterBid+BidCorrection;
   if(MasterAsk>0.0001)
      MasterAsk=MasterAsk+AskCorrection;

  }
//+------------------------------------------------------------------+
Ivan Ovchinnikov
1153
Ivan Ovchinnikov 2015.11.13 08:19  

у советника есть еще одна часть которая на другой терминал устанавливается. На другом терминале сивол EUR/USD к примеру, на клиентсок EUR/USD_e

и вот из за буквы _e он не работает, т.к скорее всего при сравнивании символов он получаюся разные

Alexey Viktorov
7818
Alexey Viktorov 2015.11.13 08:28  
Ivan Ovchinnikov:

у советника есть еще одна часть которая на другой терминал устанавливается. На другом терминале сивол EUR/USD к примеру, на клиентсок EUR/USD_e

и вот из за буквы _e он не работает, т.к скорее всего при сравнивании символов он получаюся разные

Так решение предложили первым ответом

Vitaly Muzichenko:

Обрезать лишнее: 

StringSubstr 

Ivan Ovchinnikov
1153
Ivan Ovchinnikov 2015.11.13 08:32  
Alexey Viktorov:

Так решение предложили первым ответом

мой уровень программирования не очень высокий, не могли бы вы подсказать, что именно тут надо обрезать?
Alexey Viktorov
7818
Alexey Viktorov 2015.11.13 08:52  
Ivan Ovchinnikov:
мой уровень программирования не очень высокий, не могли бы вы подсказать, что именно тут надо обрезать?

В коде показать не могу, чужие коды стараюсь не трогать. А в принципе это выглядит так:

string  StringSubstr(
   string  string_value,     // строка                    - Symbol() возвращает EURUSD_e из неё надо вытащить первые 6 символов
   int     start_pos,        // с какой позиции начать    - начать с позиции 0
   int     length=0          // длина извлекаемой строки  - извлечь 6 символов
   );

В результате получим EURUSD и это будем сравнивать с тем символом по которому поставлен ордер советником мастером.

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий