Wie findet man den Zeitpunkt des Balkens, an dem sich die gleitenden Durchschnitte gekreuzt haben? (Code innen)

 

Hallo zusammen!

Ich hatte gehofft, dass mir jemand bei meinem Code helfen könnte - ich stecke derzeit bei diesem einen verdammten Teil fest!


Dies ist der Prozess, den ich versuche, in Code unten zu schreiben:

1) Wenn alle MA's sind "aufgefächert" und gekreuzt, so dass der Preis über alle gleitenden Durchschnitte ist und sie sind ein langes Potenzial angezeigt.

2) Ich möchte dann den genauen Balken (unter Verwendung der Zeit) wissen, dass die gleitenden Durchschnitte am Kreuz der gleitenden Durchschnitte "aufgefächert" sind.

3) Wenn 1 und 2 wahr sind, warte ich dann auf jeden Balken, der wieder nach unten geht (im Falle einer Long-Position) und den 21 EMA berührt.

4) Vom ersten Bar (wo sich die MA's gekreuzt und aufgefächert haben) bis zum Bar, der jetzt den 21 EMA berührt hat - möchte ich eine Pending Order ODER am Markt platzierten Handel ÜBER den Höchstständen dieser Spanne (1 & 3).

5) Wenn der Kurs zu irgendeinem Zeitpunkt unter dem 60 EMA schließt, BEVOR die Order ausgelöst wird, dann wird die Order storniert.

Das ist natürlich nicht der gesamte Code, aber das ist der Hauptteil, mit dem ich mir die Haare raufe. Bitte überprüfen Sie den Code mit dem "<<<<<<<<<<<<<". Dies sind die Punkte, die mich verwirren.

Ich könnte WIRKLICH Hilfe gebrauchen - es wäre wirklich sehr hilfreich!

Vielen Dank im Voraus!

datetime          triggerBarTime;   <<<<< Global settings.
datetime          triggerBarTime1;  <<<<< Global settings.	



void CheckForMaTrade()
{

//+-----------------------------------------------------------------------------------------------------------------------+ 
    //Small and Big Fish on the H1 Time Frame.                                                                           |
//+-----------------------------------------------------------------------------------------------------------------------+              

   {
   double PreviousSmallFish1  =  iMA(NULL,60,3,0,1,0,2); 
   double CurrentSmallFish1   =  iMA(NULL,60,3,0,1,0,1);
   double PreviousSmallFish2  =  iMA(NULL,60,5,0,1,0,2);
   double CurrentSmallFish2   =  iMA(NULL,60,5,0,1,0,1);
   double PreviousSmallFish3  =  iMA(NULL,60,8,0,1,0,2);
   double CurrentSmallFish3   =  iMA(NULL,60,8,0,1,0,1);
   double PreviousSmallFish4  =  iMA(NULL,60,10,0,1,0,2);
   double CurrentSmallFish4   =  iMA(NULL,60,10,0,1,0,1);  
   double PreviousSmallFish5  =  iMA(NULL,60,12,0,1,0,2);
   double CurrentSmallFish5   =  iMA(NULL,60,12,0,1,0,1);
   double PreviousSmallFish6  =  iMA(NULL,60,15,0,1,0,2);
   double CurrentSmallFish6   =  iMA(NULL,60,15,0,1,0,1);  
   
      double PreviousBigFish1  =  iMA(NULL,60,30,0,1,0,2); 
      double CurrentBigFish1   =  iMA(NULL,60,30,0,1,0,1);
      double PreviousBigFish2  =  iMA(NULL,60,35,0,1,0,2);
      double CurrentBigFish2   =  iMA(NULL,60,35,0,1,0,1);
      double PreviousBigFish3  =  iMA(NULL,60,40,0,1,0,2);
      double CurrentBigFish3   =  iMA(NULL,60,40,0,1,0,1);
      double PreviousBigFish4  =  iMA(NULL,60,45,0,1,0,2);
      double CurrentBigFish4   =  iMA(NULL,60,45,0,1,0,1);
      double PreviousBigFish5  =  iMA(NULL,60,50,0,1,0,2);
      double CurrentBigFish5   =  iMA(NULL,60,50,0,1,0,1);
      double PreviousBigFish6  =  iMA(NULL,60,60,0,1,0,2);
      double CurrentBigFish6   =  iMA(NULL,60,60,0,1,0,1); 
      
            if(PreviousBigFish1<CurrentBigFish2 && CurrentBigFish1>PreviousBigFish2)
               if(PreviousBigFish2<CurrentBigFish3 && CurrentBigFish2>PreviousBigFish3)
                  if(PreviousBigFish3<CurrentBigFish4 && CurrentBigFish3>PreviousBigFish4)
                     if(PreviousBigFish4<CurrentBigFish5 && CurrentBigFish4>PreviousBigFish5)
                        if(PreviousBigFish5<CurrentBigFish6 && CurrentBigFish5>PreviousBigFish6)  
                           
                           if(PreviousSmallFish1<CurrentSmallFish2 && CurrentSmallFish1>PreviousSmallFish2)
                        if(PreviousSmallFish2<CurrentSmallFish3 && CurrentSmallFish2>PreviousSmallFish3)
                     if(PreviousSmallFish3<CurrentSmallFish4 && CurrentSmallFish3>PreviousSmallFish4)
                  if(PreviousSmallFish4<CurrentSmallFish5 && CurrentSmallFish4>PreviousSmallFish5)
                if(PreviousSmallFish5<CurrentSmallFish6 && CurrentSmallFish5>PreviousSmallFish6)triggerBarTime = Time[1];  <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
      
      
      double ema21 = iMA(NULL,60,21,0,1,0,1); 
       
        
         if (Low[1]<ema21)
         {
         
           OrderEntry(0); // BUY 
            }     
      
      
                
     if(PreviousBigFish1>CurrentBigFish2 && CurrentBigFish1<PreviousBigFish2)
      if(PreviousBigFish2>CurrentBigFish3 && CurrentBigFish2<PreviousBigFish3)
         if(PreviousBigFish3>CurrentBigFish4 && CurrentBigFish3<PreviousBigFish4)
            if(PreviousBigFish4>CurrentBigFish5 && CurrentBigFish4<PreviousBigFish5)
               if(PreviousBigFish5>CurrentBigFish6 && CurrentBigFish5<PreviousBigFish6)
               
               if(PreviousSmallFish1>CurrentSmallFish2 && CurrentSmallFish1<PreviousSmallFish2)
            if(PreviousSmallFish2>CurrentSmallFish3 && CurrentSmallFish2<PreviousSmallFish3)
         if(PreviousSmallFish3>CurrentSmallFish4 && CurrentSmallFish3<PreviousSmallFish4)
       if(PreviousSmallFish4>CurrentSmallFish5 && CurrentSmallFish4<PreviousSmallFish5)
     if(PreviousSmallFish5>CurrentSmallFish6 && CurrentSmallFish5<PreviousSmallFish6)triggerBarTime = Time[1]; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
   
    double ema21_2 = iMA(NULL,60,21,0,1,0,1); 
  
            if(High[1]>ema21_2)
            {
             
              OrderEntry(1); // SELL
             }  
   
       }

}


//+------------------------------------------------------------------+  
//+------------------------------------------------------------------+
//| Order Enter Function                                             |
//+------------------------------------------------------------------+

void OrderEntry (int direction)
{    
   double LotSize=0;
   double Equity=AccountEquity();
   double RiskedAmount=Equity*RiskPercent*0.01;
   int buyStopCandle = iLowest(NULL,0,1,CandlesBack,1); 
   int sellStopCandle = iHighest(NULL,0,2,CandlesBack,1);
   
   double buyPrice = iHighest(Symbol(), 0, MODE_HIGH, iBarShift(Symbol(), 0, triggerBarTime, true), 0);    <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 
   double sellPrice = iLowest(Symbol(), 0, MODE_LOW, iBarShift(Symbol(), 0, triggerBarTime1, true), 0);   <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
   
   double buy_stop_price = iMA(NULL,60,60,0,1,0,1)-PadAmount*pips; 
   double pips_to_bsl = Ask-buy_stop_price;         //double pips_to_bsl = Ask-buy_stop_price;   --- Old code
   double buy_takeprofit_price = Ask+pips_to_bsl*RewardRatio;   
   double sell_stop_price = iMA(NULL,60,60,0,1,0,1)+PadAmount*pips; //- Greyed out, this is an old code line.
   double pips_to_ssl = sell_stop_price-Bid;     ////double pips_to_ssl = sell_stop_price-Bid;   --- Old code
   double sell_takeprofit_price = Bid-pips_to_ssl*RewardRatio;   
   
  
   if (direction==0)//<< "0" pushes out a Buy direction
   {
      //double buyPrice = iHighest(Symbol(), 60, MODE_HIGH, iBarShift(Symbol(), 0, triggerBarTime, true), 0);//-PadAmount*pips; // new line
      int Buy_Price = buyPrice;
      
      double bsl=buy_stop_price;
      double btp=buy_takeprofit_price;
      //LotSize = (100/(0.00500/0.00010))/10
      LotSize = (RiskedAmount/(pips_to_bsl/pips))/10;
      if(OpenOrdersThisPair(Symbol())==0) //--- This means that it will not open a new order if there is one already open!If greyed out, it will take everything.
      int buyticket = OrderSend(Symbol(),Buy_Price,LotSize,Ask,3,0,0,NULL,MagicNumber,0,Green); //ask
      if(buyticket>0)OrderModify(buyticket,OrderOpenPrice(),bsl,btp,0,CLR_NONE);
   }
            
   if (direction==1) //<< "1" pushes out a Sell direction
   {
      
      //double sellPrice = iLowest(Symbol(), 60, MODE_LOW, iBarShift(Symbol(), 0, triggerBarTime1, true), 0);//+PadAmount*pips;   // new line.
      int Sell_Price = sellPrice;
      
      double ssl=sell_stop_price;
      double stp=sell_takeprofit_price; 
      //LotSize = (100/(0.00500/0.00010))/10;
      LotSize = (RiskedAmount/(pips_to_ssl/pips))/10;    
      if(OpenOrdersThisPair(Symbol())==0)  //--- This means that it will not open a new order if there is one already open! If greyed out, it will take everything.
      int sellticket = OrderSend(Symbol(),Sell_Price,LotSize,Bid,3,ssl,stp,NULL,MagicNumber,0,Red); //bid
      if(sellticket>0)OrderModify(sellticket,OrderOpenPrice(),ssl,stp,0,CLR_NONE);
   }
   
}

return(0);

 
DomGilberto:

Hallo zusammen!

Das ist natürlich nicht der ganze Code, aber das ist der Hauptteil, mit dem ich mir die Haare ausreiße. Bitte überprüfen Sie den Code mit dem "<<<<<<<<<<<<<". Dies sind die Punkte, die ich bin verwirrt über.

Bitte lesen Sie die Dokumentation für die Funktionen, die Sie verwenden ...iHighest() gibt keinen Preis zurück ... es gibt einen int"Gibt die Verschiebung des Maximalwerts über eine bestimmte Anzahl von Perioden zurück, abhängig vom Typ."
 

Danke RaptorUK - Das erklärt mir, freundlich ausgedrückt, gar nichts? In Laiensprache?

Ist dies ein Forum, in dem mir jemand wirklich helfen kann, außer die Definitionen von Funktionen zu wiederholen (die ich schon 100-mal im "Hilfe"-Bereich gelesen habe...)

Schließlich habe ich nicht das Gefühl, dass meine Frage (im Vergleich zu einigen der Threads hier!) ausreicht, um jemanden zu veranlassen, seine Zeit in Rechnung zu stellen...?

 

Die Übersetzung in Laienbegriffe wird Ihnen helfen... einmal, heute, bei diesem speziellen Problem... und nehmen Sie sich etwas Zeit für den Erklärer.

Wenn du sagst, welche der Definitionen du nicht verstehst, kannst du vielleicht beim nächsten Mal deine eigenen Probleme lösen, und nach einer Weile kannst du einer von denen sein, die die Probleme anderer Leute lösen.

Wenn du versuchst, das Problem selbst zu erforschen, wirst du auch viel mehr lernen. Versuchen Sie zum Beispiel dies:

Alert(iHighest(Symbol(), 0, MODE_HIGH, iBarShift(Symbol(), 0, triggerBarTime, true), 0));

und Sie werden sehen, welcher Wert von der Funktion zurückgegeben wird... (wie Raptor sagt, ist es kein Preis)... und Sie werden wahrscheinlich die Definition der Funktion leichter verstehen.

Solche Dinge helfen Ihnen mehr, als darauf zu hoffen, dass jemand im Forum Zeit hat, Ihren Code zu testen und die gleiche Fehlersuche zu betreiben, die Sie selbst lernen sollten.

 

Hm? Ich bin so verwirrt - bin ich zu viel für einige Hilfe fragen?

Immerhin habe ich meine gesamte EA von Grund auf aufgebaut (die ich mir selbst beigebracht habe...) Ich möchte nur etwas Anleitung von jemandem, der mehr Wissen hat als ich... :s

 

"Dinge wie diese werden Ihnen mehr helfen, als zu hoffen, dass jemand im Vorstand Zeit hat, Ihren Code zu testen und die gleiche Fehlersuche zu betreiben, die Sie selbst lernen sollten."

Was zur Hölle... Das habe ich von niemandem erwartet!?

Ihr Beitrag hat mehr Licht in die Situation gebracht - ich weiß das zu schätzen.

Dieses Forum ist wirklich lustig... Ich hatte nicht vor, jemanden zu beschimpfen! Ich wollte einfach nur klären, wie ich den Balken, der sich mit den EMA's kreuzt, richtig identifiziere...

Jeez....

 

Wenn ich die Antwort von Raptor lese, wird genau das Problem beschrieben, das Sie gemacht haben.

Preise werden als Double-Variablen gespeichert, z.B. 1.12345

die iHighest-Funktionen geben eine ganze Zahl (int) zurück, z. B. 1 oder 2 oder -100 ...., also keinen Preis.

Ich weiß nicht, was Sie zu erreichen versuchen, aber die iHighest-Funktion ist wahrscheinlich nicht diejenige, die Sie verwenden wollen.

Sie hätten das selbst herausgefunden, wenn Sie im Metaeditor auf iHighest in Ihrem Code klicken und dann F1 drücken würden... Sie werden sehen, dass die Funktion eine ganze Zahl zurückgibt (was Ihnen Raptor auch gesagt hat)

Ich kenne die Quelle Ihrer Verwirrung nicht. Wenn Sie den Unterschied zwischen int- und double-Variablen nicht kennen, fehlt es Ihnen an lebenswichtigem Grundwissen, d.h. Sie versuchen zu rennen, bevor Sie gehen können, und wollen, dass jemand anderes Sie trägt :/

EDIT: Sie haben nicht erwartet, dass Sie Ihre eigenen Probleme lösen müssen, bevor Sie jemand anderen fragen?!?

 

Mehrere gleitende Durchschnitte kreuzen sich nicht zur gleichen Zeit.

Warum posten Sie doppelt? Ihre Frage wurde bereits beantwortet.

Suchen Sie den frühesten Balken, bei dem sie alle in der richtigen Reihenfolge waren.

int DIR = 0;
for(int iBar = 0; iBar < Bar; iBar++){
   double MA20 = ... iBar), 
           MA5 = ... iBar);
          :
   if(     MA20 > MA5 && MA5 > ...) DIR = -1;
   else if(MA20 < MA5 && MA5 < ...) DIR = +1; // All fanning up.
   else if (DIR != 0){ iBar--; break; }       // Last one was cross.
}
 

Ich verstehe den Unterschied zwischen int und double...

nachdem die If-Anweisungen wahr sind, möchte ich den Balken finden, der an dem Punkt gekreuzt wurde, an dem die MAs auseinander liegen. Ich dachte, wenn ich benutze:

"triggerBarTime = Time[1];" - nach den "If"-Anweisungen dann triggerBarTime könnte in Verbindung mit iBarShift verwendet werden, um den ersten Balken des Bereichs, an dem ich interessiert bin, zu fixieren?

Mit iHighest könnte ich diese Information dann in einen int-Wert umwandeln und in meiner Orderfunktion verwenden (Buy_Price)?

 

Sie kennen vielleicht den Unterschied zwischen int und double, aber Sie verstehen nicht den Unterschied zwischen einer Taktnummer (int) und einem Preis (double).

Mit iHighest können Sie die Datumsangabe in eine Taktnummer (int.) umwandeln, aber OrderSend nimmt nur einen Preis (double) an. Es macht keinen Sinn, eine Order bei 9 zu eröffnen.

 

Ah! Erwischt!

Danke vielmals :) Ich weiß das wirklich zu schätzen!

Danke für die Geduld mit mir - ich wollte nicht so rüberkommen, dass ich erwarte, dass irgendjemand etwas für mich tut; ich wollte nur etwas Klarheit über die Hilfe (F1 zu drücken ist für mich nicht immer so klar.).

Grund der Beschwerde: