Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools  
Zurück   Metatrader Forum | Forex Expert-Advisor | Broker & Forex Tools > Metatrader 4 > Programmierung MQL4

Programmierung MQL4 Hier gehts rund ums Programmieren in MQL4.

Login
Benutzername:
Kennwort:


Statistik
Themen: 4258
Beiträge: 39394
Benutzer: 6.577
Aktive Benutzer: 255
Links: 80
Wir begrüßen unseren neuesten Benutzer: festus
Mit 483 Benutzern waren die meisten Benutzer gleichzeitig online (21.04.16 um 17:12).
Neue Benutzer:
vor 2 Tagen
- festus
vor 4 Tagen
- lovetradin...
vor 4 Tagen
- schwarz
vor 4 Tagen
- viethommy
vor 4 Tagen
- earasa

Onlineuser
'Wer ist online' anzeigen Benutzer: 1
Gäste: 171
Gesamt: 172
Team: 0
Team:  
Benutzer:  tbooo
Freunde anzeigen

Empfehlungen

Antwort
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 13.05.19
Neues Mitglied
 
Registriert seit: Oct 2016
Beiträge: 20
dundale befindet sich auf einem aufstrebenden Ast
Standard Modifizierung von PendingOrdern

Hallo alle zusammen,

ich habe mal wieder ein Problem. Ich möchte eine gesetzte Buystop-PendingOorder modifizieren.
Dazu habe ich eine Test-Version geschrieben. Eine PO wird erstellt und wenn der Preis zu weit von der PO entfernt ist, soll der PO-Preis angepasst werden.

Ich bekomme aber die Modifizierung absolut nicht hin. Kann mir jemand helfen?


HTML-Code:
//+------------------------------------------------------------------+
//|                                     TEST_Modify_PendingOrder.mq4 |
//+------------------------------------------------------------------+
#property strict
#include <stderror.mqh>
#include <stdlib.mqh>

extern double TP                  = 10;
extern double SL                  = 20;
extern double LS                  = 0.05;
extern string MyComment           = "TEST";
extern double AbstandZumMarkt     = 20;
double pips;
//+------------------------------------------------------------------+
int OnInit()
  {
// Determine what a pip is.
   pips=Point; //.00001 or .0001. .001 .01.
   if(Digits==3 || Digits==5 || Digits==1) pips*=10; //ist das gleiche wie: pips=points*10
   else if(Digits==2) pips*=100; //ist das gleiche wie: pips=points*100
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
   Comment("");
  }
//+------------------------------------------------------------------+
void OnTick()
  {
   CheckForSignal();
   Modify_PendingOrder();
  }
//+------------------------------------------------------------------+
void CheckForSignal()
{
   if(TotalOpenBuyStopPendingOrders() == 0) PlacePendingOrder(OP_BUYSTOP);
}
//+------------------------------------------------------------------+
void PlacePendingOrder(int dir)
{ 
   // Buystop-PendingOrder
   double LongEntryPrice = Ask + (AbstandZumMarkt*pips);
   double LongSL         = LongEntryPrice - SL*pips;
   double LongTP         = LongEntryPrice + TP*pips;

   if(dir == OP_BUYSTOP)
   {  int Long_ticket = OrderSend(Symbol(), dir, LS, LongEntryPrice, 30, LongSL, LongTP, MyComment, 0, 0, clrGreen); }
}
//+------------------------------------------------------------------+
void Modify_PendingOrder()
{
   double price = 0,
   new_price = 0;

   if(TotalOpenBuyStopPendingOrders() > 0)
           {
            for(int i=0;i<OrdersTotal()-1;i++)
              {
               if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
                  if(OrderSymbol() == Symbol())
                     if(OrderType()==OP_BUYSTOP)
                        {
                        int orderticket = OrderTicket();
                        if(OrderTicket() == FindLastBuyStopPendingOrder())
                           {
                           if(Ask <= (OrderOpenPrice()-(AbstandZumMarkt*pips)))
                              {
                              new_price = Ask + (AbstandZumMarkt*pips);
                              int new_ticket = OrderModify(orderticket,new_price,(new_price-(SL*pips)),(new_price+(TP*pips)),0,clrBlue);
                              }
                           }   
                        }
              }
           }   
}
//+------------------------------------------------------------------+
int TotalOpenBuyStopPendingOrders()
  {
   int total=0;
   if(OrdersTotal()>0)for(int i=OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol() == Symbol())
            if(OrderType()==OP_BUYSTOP)
               total++;
        }
      else Print(__FUNCTION__," Failed to select order ",i," ",GetLastError());
     }
   return (total);
  }
//+------------------------------------------------------------------+
int FindLastBuyStopPendingOrder()
{
   int      orderticket = 0;
   datetime last  = 0;
   for(int i = OrdersTotal()-1;i>=0;i--)
      {
      if(TotalOpenBuyStopPendingOrders() > 0)      
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
            if(OrderSymbol() == Symbol())
               if(OrderType() == OP_BUYSTOP)
                  {
                  if(last == 0 || OrderOpenTime() > last)
                     {
                     last  = OrderOpenTime();
                     orderticket = OrderTicket();
                     }
                  }
      }
   return (orderticket);
}
//+------------------------------------------------------------------+
Die Modify-Funktion möchte ich später in einen größeren Code einbauen, der neue Wert für den Preis kommt dann von einer anderen Funktion.

Ich wäre für eure hilfreichen Tipps sehr dankbar.
Mit Zitat antworten
  #2 (permalink)  
Alt 15.05.19
AVT AVT ist offline
Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 170
AVT befindet sich auf einem aufstrebenden Ast
Standard

So auf die Schnelle hilft mir immer ein Blick in die Fehlermeldungen, und wenn mir die zu unverständlich sind, baue ich für jeden einzelnen Wert ein Print ein und kontrolliere (oder rechne nach). AVT
Mit Zitat antworten
  #3 (permalink)  
Alt 16.05.19
Neues Mitglied
 
Registriert seit: Oct 2016
Beiträge: 20
dundale befindet sich auf einem aufstrebenden Ast
Standard

Danke für deine Antwort. Ich sollte wohl wirklich alle Werte, wie TP und SL, nochmal einzeln betrachten. Hatte nur einen Print für die selektierte Ticketnummer (Print nicht im Programm-Code).
Mit Zitat antworten
  #4 (permalink)  
Alt 17.05.19
AVT AVT ist offline
Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 170
AVT befindet sich auf einem aufstrebenden Ast
Standard

Ich habe es mal laufen lassen, Änderungen
1. 3 Orders (um zu sehen, ob er auch wirklich nur die letzte ändert)
2. Modify_Pending Loop-Zeile geändert
3. FindLastPending Bedingungen geändert
Probiers aus, hier der Code von den geänderten:
Code:
//+------------------------------------------------------------------+
void CheckForSignal()
{
   //if(TotalOpenBuyStopPendingOrders() == 0) PlacePendingOrder(OP_BUYSTOP);
   if(TotalOpenBuyStopPendingOrders() <3) PlacePendingOrder(OP_BUYSTOP);
}
//+------------------------------------------------------------------+
void Modify_PendingOrder()
{
	Print("Function: ",__FUNCTION__," entered"); 
	
	double price      = 0, //AktuellerEinstieg
	       new_price  = 0; //NeuerEinstieg
	int    orderticket= 0; //LetzteBuyStopNummer
	double Grenzwert  = 0; //Log MaximalAbstand
	double new_SL     = 0; //Log NeuerSL
	double new_TP     = 0; //Log NeuerTP
	
	Print("Function: ",__FUNCTION__," TotalOpenBuyStopPendingOrders=",
	      IntegerToString(TotalOpenBuyStopPendingOrders())            );      
   if(TotalOpenBuyStopPendingOrders() > 0)                            //WartendeBuyStop
   {
   	Print("Function: ",__FUNCTION__," going into Loop"); 
   	for(int i=OrdersTotal(); i>=0; i--)                             //LoopAlleOrders
      {
      	Print("Function: ",__FUNCTION__," i=",IntegerToString(i));
      	if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))                 //SelectTrades
      	{
      	   orderticket=FindLastBuyStopPendingOrder();                //LetzteBuyStopNummer
				Print("Function: ",__FUNCTION__," i=",IntegerToString(i),
				      " orderticket i=",IntegerToString(orderticket)     );
      		
      		if(   OrderSymbol()==_Symbol                              //UnserMarkt
      		   && OrderType()==OP_BUYSTOP                             //BuyStopOrder
      		   && OrderTicket()==orderticket )                        //IstLetzteBuyStop
      		{
      			Grenzwert=(OrderOpenPrice()-(AbstandZumMarkt*pips));   //MaxAbstand
      			
      			if(Ask <= Grenzwert )                                  //AskUnterGrenzwert
      			{
      				new_price = Ask + (AbstandZumMarkt*pips);           //NeuerEinstieg
      				Print("Function: ",__FUNCTION__," Ask=",DoubleToStr(Ask,_Digits),
      				      " unter Grenzwert=",DoubleToStr(Grenzwert,_Digits),
      				      " new_price=",DoubleToStr(new_price,_Digits)				      );
      				
      				int new_ticket = OrderModify(OrderTicket(),
      				                             new_price,
      				                             (new_price-(SL*pips)),
      				                             (new_price+(TP*pips)),
      				                             0,clrNONE             );
      				if( !new_ticket ) 
                     Print("Function: ",__FUNCTION__," failed to modify pending buy stop");
                  else
                  {
                  	new_SL=OrderStopLoss();
                  	new_TP=OrderTakeProfit();
                  	Print("Function: ",__FUNCTION__," changed Ticket=",IntegerToString( OrderTicket() ),
      				         " new_price=",DoubleToStr(new_price,_Digits),
      				         " new SL=",DoubleToStr(new_SL,_Digits),
      				         " new TP=",DoubleToStr(new_TP,_Digits)		  );
						}
      			}//AskUnterGrenzwert
      			else
      				Print("Function: ",__FUNCTION__," Ask=",DoubleToStr(Ask,_Digits),
      				      " noch nicht unter Grenzwert=",DoubleToStr(Grenzwert,_Digits) );
      		
      		}//OurMarket und BuyStopOrder und IstLetzteBuyStop
      		else
      			Print("Function: ",__FUNCTION__," not OurSymbol, BuyStop or last BuyStopTicket");
      	}//SelectTrades
      	else
      		Print("Function: ",__FUNCTION__," no MODE_TRADES to select");
      }//LoopAlleOrders
	}//WartendeBuyStop
	else
		Print("Function: ",__FUNCTION__," no Open BuyStopPendingOrders");
}
//+------------------------------------------------------------------+
int FindLastBuyStopPendingOrder()
{
   int      orderticket = 0; //LastTicketNo
	Print("entered Function: ",__FUNCTION__,
	      " orderticket=",IntegerToString(orderticket));
   
   //Höchste (Letzte) bis Null (Erste), break nach Treffer
   for(int i=OrdersTotal()-1; i>=0; i--)
   {
		Print("entered loop Function: ",__FUNCTION__," i=",IntegerToString(i),
		      " TotalOpenBuyStopPendingOrders=",
		      IntegerToString(TotalOpenBuyStopPendingOrders()) );
      if(TotalOpenBuyStopPendingOrders() > 0)
      {      
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
         {
            if(   OrderSymbol() == Symbol()     //OurMarket
               && OrderType() == OP_BUYSTOP  )  //BuyStopOrder
            {
                     orderticket = OrderTicket();
							Print("Function: ",__FUNCTION__," i=",IntegerToString(i),
							      " hat orderticket=",IntegerToString(orderticket)   );
                     break;
               
				}//OurMarket and BuyStopOrder
				else
					Print("Function: ",__FUNCTION__," not our Symbol or not a BuyStop");
			
			}//SELECT_BY_POS,MODE_TRADES
       }//TotalOpenBuyStopPendingOrders()>0
   }//i=OrdersTotal()-1

	Print("Function: ",__FUNCTION__," returns ticket=",IntegerToString(orderticket));
   return (orderticket);
}//+------------------------------------------------------------------+
Du kannst beim Testen die erzeugten Pendings manuell verschieben und dann sehen, welche er ändert. Hoffe das hilft Dir. AVT
Mit Zitat antworten
  #5 (permalink)  
Alt 18.05.19
Neues Mitglied
 
Registriert seit: Oct 2016
Beiträge: 20
dundale befindet sich auf einem aufstrebenden Ast
Standard

Es funktioniert!
AVT, vielen Dank für deine Hilfe.
So vielseitig die Function-Prints einzusetzten, habe ich vorher noch nicht getan. Wieder was gelernt :-)
Mit Zitat antworten
Antwort

Lesezeichen


Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are aus
Pingbacks are aus
Refbacks are aus




Alle Zeitangaben in WEZ +2. Es ist jetzt 07:48 Uhr.


Der Wavesnode - Spam Firewall
-----------------------------------------------------------------------------------------------------------------------------
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
Powered by vBCMS® 2.7.0 ©2002 - 2019 vbdesigns.de
SEO by vBSEO 3.6.1
Copyright ©2009 - 2017 by Expert-Advisor.com - Das Metatrader Forum
MetaTrader bzw. MetaTrader 4 und MetaTrader 5 sind eingetragene Marken der MetaQuotes Software Corp.
-----------------------------------------------------------------------------------------------------------------------------