Fehler, Irrtümer, Fragen - Seite 1141

 

Hallo zusammen!

Das ist ein Problem.

Ich habe erfolgreich den Wert der Bänder und MA-Indikatoren erhalten.

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];

Dann drucken Sie: B_up_s = 1.264249475876921 M_av_s = 1.2595

Dann versuche ich, eine Matrixoperation B_up_s-M_av_s durchzuführen und erhalte das Ergebnis 0.00000000.

Was ist das Wunder?

 
Alvin1976:

Hallo zusammen!

Das ist ein Problem.

Ich habe erfolgreich den Wert der Bänder und MA-Indikatoren erhalten.

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];  

Dann drucken Sie: B_up_s = 1.264249475876921 M_av_s = 1.2595

Dann versuche ich, eine B_up_s-M_av_s-Verknüpfung durchzuführen und erhalte 0,00000000 als Ergebnis.

Was ist daran so seltsam?

1) Wie man den Code einfügt.

2) In welchem Typ von Variable speichern Sie das Ergebnis der Operation? Oder noch besser, geben Sie mir bitte den Teil des Codes, in dem die Ausgabe erzeugt wird.

 
MigVRN:

1) Wie fügen Sie den Code ein?

2) In welcher Art von Variable speichern Sie das Ergebnis der Operation? Noch besser ist es, wenn Sie den Teil des Codes angeben, in dem die Ausgabe erzeugt wird.

Alle Variablen sind vom Typ double.

Ich verstehe nicht, warum Bands viele Ziffern hat, während MA nur 4 Dezimalstellen hat. Es sollte überhaupt kein Nullergebnis geben. Aus diesem Grund funktioniert der Algorithmus nicht.

In MQL4 war alles so einfach. Jetzt brauchen Sie eine höhere Optimierungsgeschwindigkeit und eine Mehrwährungsprüfung. Ich muss alles auf MQL5 übertragen (scheiß drauf)).

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

Alle Variablen sind vom Typ double.

Es ist nicht klar, warum Bands viele Ziffern und MA nur 4 Dezimalstellen hat. Und ein Nullergebnis sollte überhaupt nicht vorkommen. Das ist der Grund, warum der Algorithmus nicht funktioniert.

In MQL4 war alles so einfach. Jetzt brauchen Sie eine höhere Optimierungsgeschwindigkeit und eine Mehrwährungsprüfung. Jetzt muss ich alles auf MQL5 übertragen (scheiß drauf)).

Es sollte funktionieren. Nachfolgend finden Sie ein Skript, das auf Ihrem Code basiert und dessen Ergebnis:

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:

Alle Variablen sind vom Typ double.

Es ist nicht klar, warum Bands viele Ziffern und MA nur 4 Dezimalstellen hat. Das Ergebnis von Null sollte überhaupt nicht vorhanden sein. Aus diesem Grund funktioniert der Algorithmus nicht.

In MQL4 war alles so einfach. Jetzt brauchen Sie eine höhere Optimierungsgeschwindigkeit und eine Mehrwährungsprüfung. Ich muss alles auf MQL5 übertragen (scheiß drauf)).

Vor der Operation "Subtraktion" drucken Sie die Werte der Variablen aus, um zu sehen, was sich in den Puffern befindet:
Print("B_up_s= ",B_up_s,"; M_av_s=",M_av_s);
double q=B_up_s-M_av_s;
 
MigVRN:

Es sollte funktionieren. Nachfolgend finden Sie das Skript gemäß Ihrem Code und das Ergebnis:

Ja, das Skript funktioniert.

Auch der EA mit diesem Beispiel funktioniert.

Mein EA hingegen gibt hartnäckig Null aus. Lassen Sie uns nach einem Fehler suchen ......

 

Hallo zusammen!

Frage: Wie lässt sich ein variabler Wert bei jedem Tick in einer Minute aktualisieren, und dann wird diese Summe in einen separaten Wert geschrieben, wenn die nächste Minute schließt, wird der Wert der Summe durch den neuen Wert ersetzt?

int t = TimeSeconds();

while (t !=0)

double b - die Variable, die während jeder Minute bei jedem Tick aktualisiert wird.

double b1 - Wert der Variablen b beim vorherigen Tick.

double s - Betrag für alle Ticks innerhalb einer Minute.

double s1 - Betrag für alle Ticks innerhalb der letzten Minute.

b1=b;

s=b1+b;

wenn (t=0) s1=s;

Wie kann man die Daten bei jedem Häkchen zusammenfassen und wie schreibt man das alles richtig?

 
Alvin1976:

Ja, das Skript funktioniert.

Auch der EA mit diesem Beispiel funktioniert.

Aber mein Expert Advisor zeigt Null an. Lassen Sie uns nach dem Fehler ...... suchen.

Hier ist, was entdeckt wurde.

Wenn man den EA einfach ausführt, funktioniert er gut, aber im Strategy Tester produziert er ganz am Anfang Nullen. Aber in der nächsten Zeile werden Nullen auf magische Weise zu normalen Indikatordaten. Ich verstehe nicht, was hier los ist.....

Nachstehend finden Sie den Code.

Dies ist der Bericht des Testers.

CJ 0 19:40:47.022 Core 1 EURUSD,M15 (Alpari-Ltd-Demo): OHLC-Balkenzustände werden erzeugt. OnTick-Ausführung nur zu Beginn des Balkens
IJ 0 19:40:47.022 Core 1 EURUSD,M15: Test von experts\tmp.ex5 von 2004.01.07 00:00 bis 2004.02.02 00:00 gestartet
LK 0 19:40:47.022 Kern 1 2004.01.07 00:00:00 B_up_s=0.0 M_av_s=0.0
IM 0 19:40:47.022 Kern 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 Kern 1 2004.01.07 00:15:00 B_up_s=1.279208140152992 M_av_s=1.2718
OI 0 19:40:47.022 Kern 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 Kern 1 2004.01.07 00:30:00 B_up_s=1.279239651523307 M_av_s=1.2721
LN 0 19:40:47.022 Kern 1 2004.01.07 00:45:00 B_up_s=1.279382808470771 M_av_s=1.2714
DS 0 19:40:47.022 Kern 1 2004.01.07 01:00:00 B_up_s=1.279407737043184 M_av_s=1.2719
OD 0 19:40:47.022 Kern 1 2004.01.07 01:15:00 B_up_s=1.279398917431485 M_av_s=1.2727
NI 0 19:40:47.022 Kern 1 2004.01.07 01:30:00 B_up_s=1.279380702214008 M_av_s=1.2731
IM 0 19:40:47.022 Kern 1 2004.01.07 01:45:00 B_up_s=1.279440208228416 M_av_s=1.2723
LE 0 19:40:47.022 Kern 1 2004.01.07 02:00:00 B_up_s=1.279473515350084 M_av_s=1.272
DK 0 19:40:47.022 Kern 1 2004.01.07 02:15:00 B_up_s=1.279515146590278 M_av_s=1.2715
FL 0 19:40:47.022 Kern 1 2004.01.07 02:30:00 B_up_s=1.279601656250741 M_av_s=1.2709
IQ 0 19:40:47.022 Kern 1 2004.01.07 02:45:00 B_up_s=1.279656914787522 M_av_s=1.2709
CE 0 19:40:47.022 Kern 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:

Folgendes wurde entdeckt.

1) Erstellen Sie nicht für jeden Tick einen Indikator!

2) Prüfen Sie, ob der Indikator erstellt wurde oder nicht, bevor Sie auf seine Werte zugreifen.

3) Prüfen Sie, ob die angeforderten Werte aus dem Kennzeichen übernommen werden.

4) Löschen Sie den Berechnungsteil des Indikators immer nach Beendigung des Experten, da sonst irgendwann der Arbeitsspeicher erschöpft sein kann.

Das Problem lag darin, dass Sie versucht haben, die Werte aus dem Indikator zu kopieren, der noch nicht erstellt worden ist. Machen Sie es sich zur Regel - überprüfen Sie das Ergebnis der Funktionen, die Sie aufrufen.

Dateien:
 

Bitte teilen Sie uns mit, wo der Fehler liegt.

Ekpert läuft auf Demo, 3 Paare. Hier ist das Protokoll:

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

Hier ist der Code.

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);  
      }  

Experte versucht OrderDelete() auszuführen, gibt Fehler, SendTradeRequest() ist in while-Schleife, ekspert entsprechend Schleifen. Vielleicht hat sich der Preis geändert, als ich die Bestellung aufgegeben habe? Brauche ich RefreshRates() und wie gehe ich damit richtig um? Ich habe im Forum gesucht, aber kein Beispiel gefunden...

Ich danke Ihnen allen im Voraus