Position schließen bei kreuzen der MACD Linien

 

Hallo zusammen,

ich bastel gerade einen alten EA um. Er soll in 2 Fällen eine Buyorder und in 2 anderen Fällen eine Sellorder auslösen.

Buyorder_1 wenn MACD Linie unterhalb 0 die Signallinie von unten nach oben kreuzt oder Buyorder_2 wenn MACD Linie von unten nach oben die 0 kreuzt. 

Sellorder_1 wenn MACD Linie oberhalb 0 die Signallinie von oben nach unten kreuzt oder Sellorder_2 wenn MACD Linie von oben nach unten die 0 kreuzt.


Position schließen im Falle einer Buyorder: MACD Linie kreuzt von oben nach unten die MACD Signallinie

Position schließen im Falle einer Sellorder: MACD Linie kreuzt von unten nach oben die MACD Signallinie


Im folgenden Codeschnipsel funktioniert bisher nur das öffnen und schließen der Positionen bei der Buyorder_2 und Sellorder_2. Aktiviere ich nun die Buyorder_1 indem ich die // wegnehme, oder nehme ich Buyorder_1 testweise komplett raus funktioniert es nicht. 

//--- BUY signal

//Buyorder_2

if(macd_main[m_bar_current[+1] < 0 && macd_main[m_bar_current] > 0)

//Buyorder_1     

//if(((macd_main[m_bar_current[+1] && macd_signal[m_bar_current[+1] < 0) && (macd_main[m_bar_current[+1] < macd_signal[m_bar_current[+1]) && (macd_main[m_bar_current] > macd_signal[m_bar_current])))

{

double sl=DBL_MAX;

sl=m_symbol.Ask()-Inp_ATR_Multipl*ATR_Wert;

double tp=m_symbol.Ask()+MathAbs(m_symbol.Ask()-sl)*InpTPCoefficient; ArrayResize(SPosition,size_need_position+1);

SPosition[size_need_position].pos_type=POSITION_TYPE_BUY; SPosition[size_need_position].stop_loss=sl;

//SPosition[size_need_position].take_profit=tp; // TP für Testzwecke deaktiviert

}         

//--- SELL signal

//Sellorder_2

if(macd_main[m_bar_current[+1] > 0 && macd_main[m_bar_current] < 0)

//Sellorder_1      

//if(((macd_main[m_bar_current[+1] && macd_signal[m_bar_current[+1] > 0) && (macd_main[m_bar_current[+1] > macd_signal[m_bar_current[+1]) && (macd_main[m_bar_current] < macd_signal[m_bar_current])))

{

            double sl=DBL_MIN;

            sl=m_symbol.Bid()+Inp_ATR_Multipl*ATR_Wert;

            double tp=m_symbol.Bid()-MathAbs(sl-m_symbol.Bid())*InpTPCoefficient;

            ArrayResize(SPosition,size_need_position+1);

            SPosition[size_need_position].pos_type=POSITION_TYPE_SELL;

            SPosition[size_need_position].stop_loss=sl;

            //SPosition[size_need_position].take_profit=tp;  // TP für Testzwecke deaktiviert

           }

          

//--- Position schließen

     ENUM_POSITION_TYPE type;

      uint total=PositionsTotal();

         for(uint i=0;i<total;i++)

          {  

            if(PositionSelect(_Symbol)==true)

               {

               type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE);

               }

            }

           // Sofern offene Position eine Buy Order ist

           if(type==POSITION_TYPE_BUY)

            {

            // Sobald MACD Linie die Signallinie entgegen der Trendrichtung kreuzt Position schließen

               if(macd_main[m_bar_current[+1] > macd_signal[m_bar_current[+1] && macd_main[m_bar_current] < macd_signal[m_bar_current])

                  {

                   m_trade.PositionClose(PositionTicket);

                  } 

            }

           // Sofern offene Position eine Sell Order ist

           if(type==POSITION_TYPE_SELL)

            {

               // Sobald MACD Linie die Signallinie entgegen der Trendrichtung kreuzt Position schließen

               if(macd_main[m_bar_current[+1] < macd_signal[m_bar_current[+1] && macd_main[m_bar_current] > macd_signal[m_bar_current])

                  {

                    m_trade.PositionClose(PositionTicket);

                  }

             } 

Ich vermute schon woran es liegen könnte habe aber keine Idee, wie ich es lösen kann. Vielleicht ist hier jemand, der den Code etwas "umstellen" kann, sodass es funktioniert. Ich wäre euch sehr dankbar.

LG und bleibt gesund

Niko

 

Wenn Code gepostet wird bitte den Code-Kopf aus der Editierzeile (</>) oder Alt+S verwenden.

Wenn ein Programm nicht tut, was es tun soll, ist der Debugger (zB. mit historischen Daten) die erste Wahl. Dazu vor den kritischen Zeilen ein DebugBreak() setzen und am Zeilen Anfang die entspr. Markierung setzen.

 

Hallo Carl und danke für deinen Hinweis. Habe den Code mit Alt+S eingefügt.

So wie ich das sehe kann er die Position (Buyorder_1 oder Sellorder_1) nicht schließen, da er genau in dem Moment wo die Position geschlossen wird ein gegenläufiges Signal bekommt. Um z.B. meine Sellorder zu schließen muss POSITION_TYPE_SELL=wahr sein. Spätestens ab dem Zeitpunkt wo sich die MACD Linien gegenläufig kreuzen ist POSITION_TYPE_SELL=unwahr und wir haben eine POSITION_TYPE_BUY=wahr. Da das schließen der Sellorder die gleichen Parameter hat wie das eröffnen einer Buyorder erhalte ich nie den Wert, um eine Position zu schließen. Damit "beißt sich die Katze dauerhaft in den Schwanz" und die Position kann nie geschlossen werden bis der S/L ausgelöst wird.

An meinem o.g. Beispiel ergibt es jetzt auch Sinn, wieso Buyorder_2 und Sellorder_2 funktionieren, da hier ein Signal beim kreuzen der 0 Linie erzeugt wird und die Position geschlossen wird wenn die MACD Linien sich kreuzen. Beide Signale kommen sich so gesehen nicht in die quere.

Ich bin mir sicher, dass auch Buyorder_1 und Sellorder_1 funktionieren können nur habe ich anscheinend ein Brett vorm Kopf und kann es nicht lösen. Sitze seit Tagen dran und habe mich nun entschlossen hier zu fragen. Manchmal schaut sich wer anders den Code an und erkennt sofort die Lösung (die Hoffnung stirbt zuletzt) :) 

 
NightHawk1981:

Hallo Carl und danke für deinen Hinweis. Habe den Code mit Alt+S eingefügt.

So wie ich das sehe kann er die Position (Buyorder_1 oder Sellorder_1) nicht schließen, da er genau in dem Moment wo die Position geschlossen wird ein gegenläufiges Signal bekommt. Um z.B. meine Sellorder zu schließen muss POSITION_TYPE_SELL=wahr sein. Spätestens ab dem Zeitpunkt wo sich die MACD Linien gegenläufig kreuzen ist POSITION_TYPE_SELL=unwahr und wir haben eine POSITION_TYPE_BUY=wahr. Da das schließen der Sellorder die gleichen Parameter hat wie das eröffnen einer Buyorder erhalte ich nie den Wert, um eine Position zu schließen. Damit "beißt sich die Katze dauerhaft in den Schwanz" und die Position kann nie geschlossen werden bis der S/L ausgelöst wird.

An meinem o.g. Beispiel ergibt es jetzt auch Sinn, wieso Buyorder_2 und Sellorder_2 funktionieren, da hier ein Signal beim kreuzen der 0 Linie erzeugt wird und die Position geschlossen wird wenn die MACD Linien sich kreuzen. Beide Signale kommen sich so gesehen nicht in die quere.

Ich bin mir sicher, dass auch Buyorder_1 und Sellorder_1 funktionieren können nur habe ich anscheinend ein Brett vorm Kopf und kann es nicht lösen. Sitze seit Tagen dran und habe mich nun entschlossen hier zu fragen. Manchmal schaut sich wer anders den Code an und erkennt sofort die Lösung (die Hoffnung stirbt zuletzt) :) 

Dann schau Dir Deine if-Struktur an.

Übrigens MT5 hat ein MACD-EA als Beispiel mit im Paket und wahscheinlich auch im Fundus von MQ - such mal (oben rechts die Lupe).