Ошибки, баги, вопросы - страница 1141

 

Всем салют !

Такая проблема.

Успешно получаю значение индикаторов Bands и MA.

   Bands_handle=iBands(NULL,0,BP_var_s,0,BDev_var_s,PRICE_CLOSE);
   CopyBuffer(Bands_handle,0,0,1,Base);
   CopyBuffer(Bands_handle,1,0,1,Upper);
   CopyBuffer(Bands_handle,2,0,1,Lower);
   B_med_s=Base[0];
   B_up_s=Upper[0];
   B_low_s=Lower[0];
   
   MA_handle=iMA(NULL,0,MA_var_b,0,MODE_SMA,PRICE_TYPICAL);
   CopyBuffer(MA_handle,0,0,1,MAv);
   M_av_s=MAv[0];  
   

Далее вывожу принтом : B_up_s=1.264249475876921  M_av_s=1.2595

Далее пытаюсь совершить мат. операцию B_up_s-M_av_s и получаю в результате 0.00000000.

Что за чудеса ???

 
Alvin1976:

Всем салют !

Такая проблема.

Успешно получаю значение индикаторов Bands и MA.

Bands_handle=iBands(NULL,0,BP_var_s,0,BDev_var_s,PRICE_CLOSE);
   CopyBuffer(Bands_handle,0,0,1,Base);
   CopyBuffer(Bands_handle,1,0,1,Upper);
   CopyBuffer(Bands_handle,2,0,1,Lower);
   B_med_s=Base[0];
   B_up_s=Upper[0];
   B_low_s=Lower[0];
   
   MA_handle=iMA(NULL,0,MA_var_b,0,MODE_SMA,PRICE_TYPICAL);
   CopyBuffer(MA_handle,0,0,1,MAv);
   M_av_s=MAv[0];  
   

Далее вывожу принтом : B_up_s=1.264249475876921  M_av_s=1.2595

Далее пытаюсь совершить мат. операцию B_up_s-M_av_s и получаю в результате 0.00000000.

Что за чудеса ???

1) Как вставлять код.

 2) В переменной какого типа Вы храните результат операции? А лучше приведите ту часть кода где производится вывод.

 
MigVRN:

1) Как вставлять код.

 2) В переменной какого типа Вы храните результат операции? А лучше приведите ту часть кода где производится вывод.

Все переменные типа double.

Не понятно почему у Bands много знаков а у MA только 4 после запятой. А нулевой результат вообще не должен быть. Из за этого алгоритм не работает.

Как все просто в MQL4 было. А теперь нужна скорость оптимизации и мультвалютная проверка. Приходится переносить все на MQL5 тудыть его ))

 double q=B_up_s-M_av_s;
 Print( B_up_s-M_av_s=", DoubleToString(q));
 
Alvin1976:

Все переменные типа double.

Не понятно почему у Bands много знаков а у MA только 4 после запятой. А нулевой результат вообще не должен быть. Из за этого алгоритм не работает.

Как все просто в MQL4 было. А теперь нужна скорость оптимизации и мультвалютная проверка. Приходится переносить все на MQL5 тудыть его ))

Должно работать. Ниже скрипт по Вашему коду и его результат:

void OnStart()
  {
  
  double Base[1];
  double Upper[1];
  double Lower[1];  
  
  int BP_var_s = 20;
  int BDev_var_s = 30;
  int MA_var_b = 10;
  
  double M_av_s = 0;
  double MAv[1];
  
  double B_med_s, B_up_s, B_low_s;
  
  
   //---Далее Ваш код
   int Bands_handle=iBands(NULL,0,BP_var_s,0,BDev_var_s,PRICE_CLOSE);
   CopyBuffer(Bands_handle,0,0,1,Base);
   CopyBuffer(Bands_handle,1,0,1,Upper);
   CopyBuffer(Bands_handle,2,0,1,Lower);
   
   B_med_s=Base[0];
   B_up_s=Upper[0];
   B_low_s=Lower[0];
   
   int MA_handle=iMA(NULL,0,MA_var_b,0,MODE_SMA,PRICE_TYPICAL);
   
   CopyBuffer(MA_handle,0,0,1,MAv);
   M_av_s=MAv[0]; 
   
    double q = B_up_s - M_av_s;
    
    Print("B_up_s-M_av_s=", DoubleToString(q));
   
  }

 

 

 
Alvin1976:

Все переменные типа double.

Не понятно почему у Bands много знаков а у MA только 4 после запятой. А нулевой результат вообще не должен быть. Из за этого алгоритм не работает.

Как все просто в MQL4 было. А теперь нужна скорость оптимизации и мультвалютная проверка. Приходится переносить все на MQL5 тудыть его ))

Перед операцией "вычитание" распечатайте значение переменных, чтобы узнать что у Вас в буферах:
Print("B_up_s= ",B_up_s,"; M_av_s=",M_av_s);
double q=B_up_s-M_av_s;
 
MigVRN:

Должно работать. Ниже скрипт по Вашему коду и его результат:

 

 

Да скрипт работает.

Даже советник с этим примером работает.

А вот мой советник выдает ноль упорно. Будем искать ошибку ......

 

Всем привет!

 Вопрос такой, как сделать чтобы суммировались значения переменной, обновляемой на каждом тике в течении минуты, а потом эта сумма записывалась в отдельное значение, по истечению закрытия следующей минуты значение сумму заменялось новым?

int t = TimeSeconds();  

while (t !=0) 

double b - переменная, которая обновляется в течение минуты на каждом тике.

double b1 - значение переменной b на предыдущем тике. 

double s - сумма на всех тиках в течение минуты.

double s1 - сумма на всех тиках в течение прошедшей минуты.

b1=b;

s=b1+b; 

if (t=0) s1=s; 

Как сделать чтобы данные суммировались на каждом тике и как вообще всё это правильно записать? 

 
Alvin1976:

Да скрипт работает.

Даже советник с этим примером работает.

А вот мой советник выдает ноль упорно. Будем искать ошибку ......

Вот что обнаружилось.

Если просто запустить советник то он работает нормально а вот в тестере он выдает нули в самом начале. А уже при выполнении следующей строки нули волшебным образом становятся нормальными данными индикаторов. Не пойму в чем дело.....

Ниже код.

Вот что выдает тестер

CJ    0    19:40:47.022    Core 1    EURUSD,M15 (Alpari-Ltd-Demo): OHLC bar states generating. OnTick executed on the bar begin only
IJ    0    19:40:47.022    Core 1    EURUSD,M15: testing of Experts\tmp.ex5 from 2004.01.07 00:00 to 2004.02.02 00:00 started
LK    0    19:40:47.022    Core 1    2004.01.07 00:00:00    B_up_s=0.0   M_av_s=0.0
IM    0    19:40:47.022    Core 1    2004.01.07 00:00:00   sbl_top=true     B_up_s=0.0  M_av_s=0.0  B_up_s-M_av_s=0.00000000
OQ    0    19:40:47.022    Core 1    2004.01.07 00:15:00    B_up_s=1.279208140152992   M_av_s=1.2718
OI    0    19:40:47.022    Core 1    2004.01.07 00:15:00   sel=true    B_up_s=1.279208140152992  M_av_s=1.2718  B_up_s-M_av_s=0.00740814
CJ    0    19:40:47.022    Core 1    2004.01.07 00:30:00    B_up_s=1.279239651523307   M_av_s=1.2721
LN    0    19:40:47.022    Core 1    2004.01.07 00:45:00    B_up_s=1.279382808470771   M_av_s=1.2714
DS    0    19:40:47.022    Core 1    2004.01.07 01:00:00    B_up_s=1.279407737043184   M_av_s=1.2719
OD    0    19:40:47.022    Core 1    2004.01.07 01:15:00    B_up_s=1.279398917431485   M_av_s=1.2727
NI    0    19:40:47.022    Core 1    2004.01.07 01:30:00    B_up_s=1.279380702214008   M_av_s=1.2731
IM    0    19:40:47.022    Core 1    2004.01.07 01:45:00    B_up_s=1.279440208228416   M_av_s=1.2723
LE    0    19:40:47.022    Core 1    2004.01.07 02:00:00    B_up_s=1.279473515350084   M_av_s=1.272
DK    0    19:40:47.022    Core 1    2004.01.07 02:15:00    B_up_s=1.279515146590278   M_av_s=1.2715
FL    0    19:40:47.022    Core 1    2004.01.07 02:30:00    B_up_s=1.279601656250741   M_av_s=1.2709
IQ    0    19:40:47.022    Core 1    2004.01.07 02:45:00    B_up_s=1.279656914787522   M_av_s=1.2709
CE    0    19:40:47.022    Core 1    2004.01.07 03:00:00    B_up_s=1.279579626541548   M_av_s=1.2707

//#property link      "http://www.mql5.com"
//#property version   "1.00"

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

 double
   BDev_var_b=2,       
   BDev_var_s=2,       
   B_up_s=0, 
   B_low_s=0,
   B_med_s=0,
   M_av_s=0, 
   Base[1],
   Upper[1],
   Lower[1],
   MAv[1],   
   Dist_c=0.0015,
   Dist_d=0.002;
   
  bool 
    selord=false,  
    baiord=false,
    New_Bar=false, 
    sbl_top=false,    
    sbl_bot=false, 
    bai=false,  
    sel=false;
   
   int
    Bands_handle,    
    MA_handle,   
    MA_var_s=1,   
    BP_var_s=50;  

    
//=============================================================================================================
int OnInit()
  {

   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {


   Bands_handle=iBands(NULL,0,BP_var_s,0,BDev_var_s,PRICE_CLOSE);
   CopyBuffer(Bands_handle,0,0,1,Base);
   CopyBuffer(Bands_handle,1,0,1,Upper);
   CopyBuffer(Bands_handle,2,0,1,Lower);
   B_med_s=Base[0];
   B_up_s=Upper[0];
   B_low_s=Lower[0];
   
   MA_handle=iMA(NULL,0,MA_var_s,0,MODE_SMA,PRICE_TYPICAL);
   CopyBuffer(MA_handle,0,0,1,MAv);
   M_av_s=MAv[0];
   
   
  Print(" B_up_s=",B_up_s, "   M_av_s=", M_av_s);  

   
   // установка флагов
  if (sbl_top==false && (B_up_s-M_av_s)<Dist_c) 
     {
       sbl_top=true;
       Print("sbl_top=true   ","  B_up_s=",B_up_s, "  M_av_s=", M_av_s, "  B_up_s-M_av_s=", DoubleToString(B_up_s-M_av_s));
     }
  if (sbl_top==true && (B_up_s-M_av_s)>Dist_d)
       {
       sbl_top=false;
       Print("sel=true  ","  B_up_s=",B_up_s, "  M_av_s=", M_av_s, "  B_up_s-M_av_s=", DoubleToString(B_up_s-M_av_s));
       }
    


    return;                                   
   }


 
Alvin1976:

Вот что обнаружилось.

1) Не надо создавать индикаторы на каждом тике!

2) Нужно проверять - создался индикатор или нет, прежде чем обращяться к его значениям.

3) Нужно проверять - скопировались ли запрашиваемые значения из индикатора.

4) Всегда удаляйте расчетную часть индикатора после завершения эксперта, а то может в какой-то момент и оперативы не хватить.

 

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

Файлы:
 

Подскажите пожалуйста где ошибка.

Екперт работает на демо, 3 пары. Вот Лог:

PUSD,M15)       AUDUSD Request executed: delete buy Ticket: #729600 Price = 0.94794 Lots = 0.1 StopLoss = 0 TakeProfit = 0 Comment = BuyTP(4)
LH      0       08:45:05.881    Serendipity5.0 (GBPUSD,M15)     AUDUSD Request executed: delete buy Ticket: #729598 Price = 0.94514 Lots = 0.42 StopLoss = 0 TakeProfit = 0 Comment = BuyTP(4)
KM      0       08:45:06.053    Serendipity5.0 (GBPUSD,M15)     Error: AUDUSD Action: delete buy : Requested Volume: 0.42, Requested StopLoss:0, Requested TakeProfit:0, Requested Price:0.94514 Error:10013
OE      0       08:45:06.053    Serendipity5.0 (GBPUSD,M15)     Sleep() for 1 second, retry
LO      0       08:45:07.145    Serendipity5.0 (GBPUSD,M15)     DeletePendings(): AUDUSD Error deleting pending order: Error Code: 4756
CQ      0       08:45:07.145    Serendipity5.0 (GBPUSD,M15)     SendOrder(); OrderCheck() Error = 10013 Sleep() for 1 second, retry
GP      0       08:45:08.237    Serendipity5.0 (GBPUSD,M15)     DeletePendings(): AUDUSD Error deleting pending order: Error Code: 4756
PL      0       08:45:08.237    Serendipity5.0 (GBPUSD,M15)     SendOrder(); OrderCheck() Error = 10013 Sleep() for 1 second, retry

 Вот код

bool SendTradeRequest(string symb,ENUM_ORDER_TYPE type,ENUM_TRADE_REQUEST_ACTIONS tradeAction,double price, 
   double lot,double stopLoss,double takeProfit,long const magic, string comment,ulong ticket){
//--- prepare a request
   MqlTradeRequest request={0};
   //ZeroMemory(request);
   
   request.action=tradeAction;        
   request.magic=magic;              
   request.symbol=symb;                 
   request.volume=lot;                         
   request.sl=stopLoss;                             
   request.tp=takeProfit;                                 
   request.type=type;              
   request.price=price;
   request.comment=comment;
   if(tradeAction==TRADE_ACTION_MODIFY || tradeAction==TRADE_ACTION_REMOVE)request.order=ticket;
      
//--- send a trade request
   MqlTradeResult result={0};
   MqlTradeCheckResult checkresult={0};
   //ZeroMemory(result);
   //ZeroMemory(checkresult);
   bool isSuccessful;
   isSuccessful=OrderCheck(request,checkresult);
   if(checkresult.retcode!=0 && checkresult.retcode!=10009 && checkresult.retcode!=10008){
      Print("SendOrder(); OrderCheck() Error = ",checkresult.retcode, " Sleep() for 1 second, retry"); 
      Sleep(1000); return(0);                                      
      }       
      
   isSuccessful=OrderSend(request,result);        
   if( (result.retcode == 10009 || result.retcode == 10008 || result.retcode == 0) ){
      //--- write the server reply to log  
      //Print(__FUNCTION__,":",result.comment);
      Print(symb," "+result.comment+": "+ConvertTradeActionToString(request.action)+" ",(string)ConvertOrderTypeToString(request.type)," Ticket: #",(string)result.order," Price = ",(string)request.price," Lots = ",(string)request.volume,
         " stopLoss = ",(string)request.sl," takeProfit = ",(string)request.tp," Comment = ",(string)request.comment);
      
      if(tradeAction==TRADE_ACTION_PENDING)   
         arrow_cntr=CreateSignalArrow("Open "+(string)ConvertOrderTypeToString(request.type)+" "+request.comment+" Ticket "+(string)result.order+
            " Lots "+DoubleToString(request.volume,2)+" Time "+TimeToString(TimeCurrent(),TIME_MINUTES),arrow_cntr,request.price,216,clrDarkViolet,symb);
      
      if(tradeAction==TRADE_ACTION_MODIFY)   
         arrow_cntr=CreateSignalArrow("OrderModify "+request.comment+" Ticket "+(string)request.order+" Lots "+DoubleToString(request.volume,2)+
            " Time "+TimeToString(TimeCurrent(),TIME_MINUTES),arrow_cntr,request.price,251,clrSilver,symb); 
      
      if(tradeAction==TRADE_ACTION_REMOVE)
         arrow_cntr=CreateSignalArrow("OrderDelete "+request.comment+" Ticket "+(string)request.order+" Lots "+DoubleToString(request.volume,2)+
            " Time "+TimeToString(TimeCurrent(),TIME_MINUTES),arrow_cntr,Close(1,symb),158,Red,symb);      
      
      CheckErrorMessage("SendTradeRequest():");
      return(1);  
      }  

 Експерт пытается произвести OrderDelete(), дает ошибку, SendTradeRequest() находится в цикле while, експерт соответствено зацикливает. Может цена поменялась в момент отправки заявки? Нужен ли RefreshRates() и как с ним правильно работать, искал в форуме но не нашел нигде примера.. 

Спасибо заранее всем