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: 4973
Beiträge: 43254
Benutzer: 7.219
Aktive Benutzer: 81
Links: 84
Wir begrüßen unseren neuesten Benutzer: Hopfen&Malz
Mit 2.475 Benutzern waren die meisten Benutzer gleichzeitig online (16.01.20 um 22:38).
Neue Benutzer:
vor einem Tag
- Hopfen&Mal...
vor 2 Tagen
- frankmicha...
vor einer Woche
- DFeck
vor einer Woche
- bb1107
vor 2 Wochen
- rg-trader

Onlineuser
'Wer ist online' anzeigen Benutzer: 0
Gäste: 1052
Gesamt: 1052
Team: 0
Team:  
Benutzer:  
Freunde anzeigen

Empfehlungen

Thema geschlossen
 
Themen-Optionen Thema durchsuchen Ansicht
  #1 (permalink)  
Alt 13.05.19
Neues Mitglied
 
Registriert seit: Oct 2016
Beiträge: 25
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.
  #2 (permalink)  
Alt 15.05.19
AVT AVT ist offline
Elite Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 612
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
  #3 (permalink)  
Alt 16.05.19
Neues Mitglied
 
Registriert seit: Oct 2016
Beiträge: 25
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).
  #4 (permalink)  
Alt 17.05.19
AVT AVT ist offline
Elite Mitglied
 
Registriert seit: Mar 2018
Ort: Hamburg
Beiträge: 612
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
  #5 (permalink)  
Alt 18.05.19
Neues Mitglied
 
Registriert seit: Oct 2016
Beiträge: 25
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 :-)
Thema geschlossen

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 +1. Es ist jetzt 21:49 Uhr.





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