Jede Anfängerfrage, um das Forum nicht zu überladen. Fachleute, gehen Sie nicht vorbei. Nirgendwo ohne dich - 6. - Seite 223

 
ALXIMIKS:


Ich habe Zeit gehabt - ich habe mir einen Algorithmus für die Aufgabe ausgedacht, ihn beschrieben (im Detail, vielleicht ein bisschen falsch für einige Leute - Menschen sind unterschiedlich in Bezug auf die Rentabilität).

Sarkasmus? Ich weiß es nicht, ich will nur helfen.

den Code für jemanden schreiben? mehr optimieren? (ja, das kann ich, aber ist es das wert?)

(p.s. artmedia70, nichts für ungut, ich respektiere Ihre Haltung und Meinung im Allgemeinen - ehrlich gesagt, aber der andere Tag, den Sie selbst gab den Code von iCustom-y, um es milde auszudrücken nicht sehr optimiert).

So etwas sollte funktionieren, wenn Sie es in die Prüfung für einen neuen Balken einfügen.

Der Code wäre optimaler, wenn kilkict=iBars(sy,tf) nach einer bestimmten Anzahl von Fraktalen eingegrenzt würde, um nicht ständig alle Balken durchzugehen.

Ich danke Ihnen. Ich habe angefangen, nach Ihrem Algorithmus zu schreiben. Aber mit Flaggen sind Sie so nah an Peking dran wie ich. Nochmals vielen Dank.
 
gince:
Ich danke Ihnen. Ich habe angefangen, nach Ihrem Algorithmus zu schreiben. Aber mit Flaggen bin ich genauso weit von Peking entfernt wie Sie. Nochmals vielen Dank.


https://www.mql5.com/ru/forum/131516/page34

Dort unten - ein früher Artikel teilte seine Erfahrungen. Genau zu diesem Thema.

 
tara:


https://www.mql5.com/ru/forum/131516/page34

Dort unten - ein früher Artikel teilte seine Erfahrungen. Genau zu diesem Thema.


SPS
 

Was könnte das Problem sein?

Manchmal wird während eines Tests ein Fehler bei der Division durch "O" angezeigt

double LotsOptimized()
  {
   double lot=Lots;
   double Lot;
   if (isFloatLots == true)          // если флаг true то проводится оптимизация величины лота, иначе лот неизменен
     {  
        int orders=HistoryTotal();  // history orders total
        int losses=0; // number of losses orders without a break
        double loss=0;              
//---- select lot size
        double  lot_min         = MarketInfo( Symbol(), MODE_MINLOT  ); 
        double  lot_max         = MarketInfo( Symbol(), MODE_MAXLOT  ); 
        double  lot_step        = MarketInfo( Symbol(), MODE_LOTSTEP ); 
        double  lotcost         = MarketInfo( Symbol(), MODE_TICKVALUE );       
                
        lot                             = 0.0;
        double  dollarsPerPip   = 0.0;
        
        lot = AccountBalance()*MaxR/100.0;
        dollarsPerPip = lot/SL;
                
        lot = NormalizeDouble( dollarsPerPip/lotcost, 2 );      
        
        lot = NormalizeDouble( lot / lot_step, 0 ) * lot_step;
        
        if ( lot < lot_min ) lot = lot_min;
        if ( lot > lot_max ) lot = lot_max;
        
        if ( AccountFreeMarginCheck( Symbol(), type, lot ) < 10 || GetLastError() == 134 ) 
        { 
                Alert ( "Impossible to open position with lot = ", DoubleToStr( lot, 2 ), ". Not enough money." );
                return(-1);
        }
//---- return lot size
//         if(lot<0.1) lot=0.1;
           
//---- calcuulate number of losses orders without a break
           if(DcF>0)
          {  
        for(int i=orders-1;i>=0;i--)
                  {
                 if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)==false) 
                   { 
                        Print("Ошибка в истории!"); 
                        break;
                   }
                if(OrderSymbol()!=Symbol() || OrderType()>OP_SELL) 
                  continue;
                 if(OrderProfit()>0)  break;
                if(OrderProfit()<0) losses++;loss=loss-OrderProfit();
                  }
        if(losses>=losses_orders) {Lot=NormalizeDouble(MathAbs(loss)/FV/MarketInfo(Symbol(),MODE_TICKVALUE)/TakeProfit1,1);
         }
       }
     }  
//---- return lot size
     if (Lot>lot) lot=Lot; 
   
  return(lot);
  }
 
Stells:

Was könnte das Problem sein?

Manchmal wird während eines Tests der Fehler "Division durch O" angezeigt.


Suchen Sie nach dem "/"-Zeichen und sehen Sie, welche Variablen des Benutzers an der Teilung beteiligt sind:

SL ;

FV ;

TakeProfit1 .

Einige von ihnen können 0 sein.

 
Stells:

Was könnte das Problem sein?

Manchmal wird während eines Tests ein Fehler bei der Division durch "O" angezeigt

Machen Sie einen Typentest:

if(!SL==0)
   {
  dollarsPerPip = lot/SL;
   }
Und so weiter.
 
ALXIMIKS:


Ich danke Ihnen nochmals. Ich habe versucht, Ihren Code zu verstehen und Kommentare zu schreiben. Ich habe es für mich selbst getan, um zu verstehen, und vielleicht werde ich etwas Ähnliches schreiben. Ich studiere und versuche, die Logik der Arbeit anderer Leute zu verstehen. Dann versuche ich es selbst.

Vielleicht finden Sie die Zeit, meine Kommentare zu überprüfen und gegebenenfalls zu korrigieren. Eine weitere Frage.

  if (Bufer0!=EMPTY_VALUE) 

Bedeutet dies, dass der Indikatorpuffer nicht leer ist, oder hat diese Variable eine andere Bedeutung? Der Indikatorpuffer würde lauten

Bufer0[i]

Alle Codes mit Kommentaren.

 int    counted_bars=IndicatorCounted();
//----
   int   a1=0,                               //преведущий фрактал (-1 ->нижний, 1 -> верхний)
         a2,                                 //нынешний фрактал  (-1 ->нижний, 1 -> верхний)
         a3,                                 //сума преведущий + нынешний
         kilkict,
         frac,                               //frac - флаг существования фракталов,
         frac1=0;                            //frac1- счетчик фракталов (+1 или 0 за цикл)
   int i;
   double Bufer0;                            //
   kilkict=iBars(NULL, 0);

   for (i=3; i<kilkict;i++){
      a2=0;frac=0;
      if(iFractals(NULL, 0, MODE_UPPER, i)>0) {            
         if (Bufer0!=EMPTY_VALUE) {          //
            a2+=1;                           //к числу фракталов добовляем 1
            frac=1;                          //флаг - фрактал есть
            frac1++;                         //счечик увеличиваем на 1
         }
      }
      if(iFractals(NULL, 0, MODE_LOWER, i)>0) {            
         if (Bufer0!=EMPTY_VALUE) {          //
            if(a2==0){
               frac1++;                      //счечик увеличиваем на 1 
               frac=1;                       //флаг - фрактал есть
            }
            a2+=-1;                          //к числу фракталов добовляем -1(т. е. уменшаем)
         }
      } 
      if (frac==0){continue;}                // если флага нет (фрактал ненайден)
      if (frac1==1){                         //если счечик равен 1,
         a1=a2; continue;
      }          
      a3=a1+a2;
      if(a3<0)           { a1=a2;continue;}//Два фрактала вниз  подряд найдено// 
      if(a3>0)           { a1=a2; continue;}//Два фрактала вверх подряд найдено //
      if(a3==0 && a1==0) { a1=a2;}// Два фрактала подряд вверх и два фрактала подряд вниз найдено //
   }

 

gince:

if (Bufer0!=EMPTY_VALUE) 

Bedeutet dies, dass der Indikatorpuffer nicht mehr leer ist, oder hat diese Variable eine andere Bedeutung?

Diese Zeile kann entfernt werden, da iFractals() als Abwesenheit eines Fraktals nicht den "leeren Wert"(EMPTY_VALUE), sondern Null zurückgibt.

Meine Frage lautet wie folgt: Versuchen Sie, einen Indikator zu erstellen, der nach zwei aufeinanderfolgenden Fraktalen sucht? Oder suchen Sie in Ihrem EA nach zwei aufeinanderfolgenden Fraktalen, die dem aktuellen Balken am nächsten sind? Diese Frage ist nicht umsonst, denn die Suchmethoden im Indikator und im Expert Advisor sind unterschiedlich - der Indikator rechnet vom Ende zum Anfang, also von der Vergangenheit zur Gegenwart, während der Expert Advisor die Balken von der Gegenwart zur Vergangenheit durchsucht. Daher sind auch die Suchrichtungen für den Expert Advisor und den Indikator unterschiedlich.

Eine letzte Frage: Wie soll das Ergebnis aussehen?

 
artmedia70:

Diese Zeile kann entfernt werden, da iFractals() Null als kein Fraktal zurückgibt, und nicht den "leeren Wert" (EMPTY_VALUE).

Meine Frage lautet wie folgt: Versuchen Sie, einen Indikator zu erstellen, der nach zwei aufeinanderfolgenden Fraktalen sucht? Oder suchen Sie in Ihrem EA nach zwei aufeinanderfolgenden Fraktalen, die dem aktuellen Balken am nächsten sind? Diese Frage ist nicht umsonst, denn die Suchmethoden im Indikator und im Expert Advisor sind unterschiedlich - der Indikator rechnet vom Ende zum Anfang, also von der Vergangenheit zur Gegenwart, während der Expert Advisor die Balken von der Gegenwart zur Vergangenheit durchsucht. Dementsprechend sind auch die Suchrichtungen im Expert Advisor und im Indikator unterschiedlich.

Und die letzte Frage: Was soll das Ergebnis sein?



Die Suchmethoden im Indikator und im EA sind unterschiedlich - der Indikator rechnet vom Ende zum Anfang - von der Vergangenheit zur Gegenwart, während der EA die Balken von der Gegenwart zur Vergangenheit durchsucht .

for (i=kilkict;i>0;i--)

Das Ergebnis: die oberen beiden -> verkaufen (Pfeil nach unten), die unteren beiden -> kaufen (Pfeil nach oben). Das Signal erscheint +2 Balken rechts vom Fraktal. Das würde ich gerne zu Beginn der Geschichte visuell sehen. Und wahrscheinlich werden wir einen Filter brauchen.

 
ALXIMIKS:


...

etwa so...

...


Sagen Sie mir, erklären Sie mir, wie es kommt, dass sie statt "dies" "dies" schreiben?

1. Wissen Sie nicht, dass "it" mit einem "e" und nicht mit einem "f" geschrieben wird?

2. zu faul ist, die Hand zum Buchstaben "e" zu bewegen, ist es einfacher, "e" zu drücken?

3. Gibt es keine "e"-Taste auf der Tastatur? Wenn nicht, warum nicht?

4. Handelt es sich um eine besondere Art von Ponce?

5. Ein anderer unbekannter Grund. Was ist das?