Fragen Sie! - Seite 63

 

Ok, ich habe die Pivot-Berechnung herausgefunden. Vielen Dank für Ihre Hilfe.

Das Problem, mit dem ich jetzt konfrontiert bin, besteht darin, dass, wenn die Pending Order korrekt an den richtigen Kursorten geöffnet wird, sie weiterhin jedes Mal, wenn sich der Kurs um 1 Pip bewegt, Pending Orders öffnet.

Ich habe nachgeschaut und werde weiter recherchieren, warum das passiert, aber ich wollte sehen, ob Sie mir einen Tipp geben oder helfen können, wenn Sie einen Logikfehler sehen, den ich mache.

Wie immer vielen Dank für Ihre Zeit.

extern int look_price_hour = 1; // Change for your time zone (my is +1 Hour). Should be 9AM London time.

extern int look_price_min = 35; // Offset in minutes when to look on price.

extern int close_hour = 12; // Close all orders after this hour

bool use_close_hour = true; // set it to false to ignore close_hour

int take_profit = 20;

extern int Currency_Spread = 4;

int open_long = 21;

int open_short = 21;

int stop_long = 30;

int stop_short = 30;

extern int slippage = 0;// Put what your brooker requires

extern double lots = 0.20; // Position size

extern int magic = 123;

bool clear_to_send = true;

void ReportStrategy()

{

int totalorders = HistoryTotal();

double StrategyProfit = 0.0;

double StrategyProfitOpen = 0.0;

int StrategyOrders = 0;

int StrategyOrdersOpen = 0;

for(int j=0; j<totalorders;j++)

{ if(OrderSelect(j, SELECT_BY_POS, MODE_HISTORY) &&

(OrderMagicNumber() == magic))

{

if((OrderType() == OP_BUY) ||

(OrderType() == OP_SELL))

{

StrategyOrders++;

StrategyProfit += OrderProfit();

}

}

}

totalorders = OrdersTotal();

for(j=0; j<totalorders;j++)

{ if(OrderSelect(j, SELECT_BY_POS, MODE_TRADES) &&

(OrderMagicNumber() == magic))

{

if((OrderType() == OP_BUY) ||

(OrderType() == OP_SELL))

{

StrategyOrdersOpen++;

StrategyProfitOpen += OrderProfit();

}

}

}

Comment("Daily20Pip EA Executed ", StrategyOrders,"+",StrategyOrdersOpen, " trades with ", StrategyProfit,"+",

StrategyProfitOpen," = ",StrategyProfit+StrategyProfitOpen," of profit\n",

"Server hour: ", TimeHour(CurTime()), " Local hour: ", TimeHour(LocalTime()));

return;

}

//+------------------------------------------------------------------+

//| expert initialization function |

//+------------------------------------------------------------------+

int init()

{

//----

ReportStrategy();

//----

return(0);

}

//+------------------------------------------------------------------+

//| expert deinitialization function |

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| expert start function |

//+------------------------------------------------------------------+

int start()

{

ReportStrategy();

if(Hour() >= close_hour &&

use_close_hour){

// we are after closing time

int totalorders = OrdersTotal();

for(int j=0;j<totalorders;j++){

OrderSelect(j, SELECT_BY_POS, MODE_TRADES);

if(OrderSymbol()==Symbol() &&

OrderMagicNumber() == magic){

if(OrderType() == OP_BUY)

OrderClose(OrderTicket(), OrderLots(), Bid, 0, Red);

if(OrderType() == OP_SELL)

OrderClose(OrderTicket(), OrderLots(), Ask, 0, Red);

if(OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP)

OrderDelete(OrderTicket());

}

}

return(0);

}

if(Hour() == look_price_hour &&

Minute() >= look_price_min &&

clear_to_send){

// Probably I need to close any old positions first:

totalorders = OrdersTotal();

for(j=0;j<totalorders;j++){

OrderSelect(j, SELECT_BY_POS, MODE_TRADES);

if(OrderSymbol()==Symbol() &&

OrderMagicNumber() == magic){

if(OrderType() == OP_BUY)

OrderClose(OrderTicket(), OrderLots(), Bid, 0, Red);

if(OrderType() == OP_SELL)

OrderClose(OrderTicket(), OrderLots(), Ask, 0, Red);

if(OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP)

OrderDelete(OrderTicket());

}

}

}

double PIVOT;

PIVOT = (iHigh(NULL,PERIOD_D1,1) + iLow(NULL,PERIOD_D1,1) + iClose(NULL,PERIOD_D1,1))/3;

// Send orders:

OrderSend(Symbol(),

OP_BUYSTOP,

lots,

PIVOT+(open_long+Currency_Spread)*Point, // Spread included

slippage,

PIVOT+((open_long+Currency_Spread)-stop_long)*Point,

PIVOT+((open_long+Currency_Spread)+take_profit)*Point,

NULL,

magic,

0,

FireBrick);

OrderSend(Symbol(),

OP_SELLSTOP,

lots,

PIVOT-open_short*Point,

slippage,

PIVOT-(open_short-stop_short)*Point,

PIVOT-(open_short+take_profit)*Point,

NULL,

magic,

0,

FireBrick);

clear_to_send = false; // mark that orders are sent

if(!clear_to_send){ // there are active orders

int long_ticket = -1;

int short_ticket = -1;

bool no_active_order = true;

totalorders = OrdersTotal();

for(j=0;j<totalorders;j++){

OrderSelect(j, SELECT_BY_POS, MODE_TRADES);

if(OrderSymbol()==Symbol() &&

OrderMagicNumber() == magic){

if(OrderType() == OP_BUYSTOP)

long_ticket = OrderTicket();

if(OrderType() == OP_SELLSTOP)

short_ticket = OrderTicket();

if(OrderType() == OP_BUY ||

OrderType() == OP_SELL) // Active order

no_active_order = false; }

}

if(short_ticket == -1 && long_ticket != -1)

OrderDelete(long_ticket);

if(long_ticket == -1 && short_ticket != -1)

OrderDelete(short_ticket);

if(long_ticket == -1 && short_ticket == -1 && no_active_order &&

Hour() != look_price_hour && Minute() >= look_price_min)

clear_to_send = true;

if(Hour() == (look_price_hour-1) &&

MathAbs(Minute() - look_price_min) < 10)

clear_to_send = true;

}

//----

return(0);

}

 

Bezüglich meines vorherigen Beitrags,

Es sieht so aus, als ob "clear_to_send = false;" nicht nach der schwebenden Bestellung wechselt. Irgendwelche Ideen?

Dies geschah, sobald ich den Pivot zu meinem Bezugspunkt für schwebende Aufträge mache. Wenn ich diese Logik nicht lösen kann, dann schätze ich, dass ich versuchen werde, herauszufinden, wie man einen Pivot aus einem Indikator referenziert und ihn aus dem EA aufruft. nicht sicher, ob das möglich ist, aber ich sehe diese als meine Optionen.

Jeder Rat oder Hilfe ist willkommen.

 

extern int look_price_hour = 1; // Change for your time zone (my is +1 Hour). Should be 9AM London time.

extern int look_price_min = 35; // Offset in minutes when to look on price.

extern int close_hour = 12; // Close all orders after this hour

bool use_close_hour = true; // set it to false to ignore close_hour

int take_profit = 20;

extern int Currency_Spread = 4;

int open_long = 21;

int open_short = 21;

int stop_long = 30;

int stop_short = 30;

extern int slippage = 0;// Put what your brooker requires

extern double lots = 0.20; // Position size

extern int magic = 123;

bool clear_to_send = true;

void ReportStrategy()

{

int totalorders = HistoryTotal();

double StrategyProfit = 0.0;

double StrategyProfitOpen = 0.0;

int StrategyOrders = 0;

int StrategyOrdersOpen = 0;

for(int j=0; j<totalorders;j++)

{ if(OrderSelect(j, SELECT_BY_POS, MODE_HISTORY) &&

(OrderMagicNumber() == magic))

{

if((OrderType() == OP_BUY) ||

(OrderType() == OP_SELL))

{

StrategyOrders++;

StrategyProfit += OrderProfit();

}

}

}

totalorders = OrdersTotal();

for(j=0; j<totalorders;j++)

{ if(OrderSelect(j, SELECT_BY_POS, MODE_TRADES) &&

(OrderMagicNumber() == magic))

{

if((OrderType() == OP_BUY) ||

(OrderType() == OP_SELL))

{

StrategyOrdersOpen++;

StrategyProfitOpen += OrderProfit();

}

}

}

Comment("Daily20Pip EA Executed ", StrategyOrders,"+",StrategyOrdersOpen, " trades with ", StrategyProfit,"+",

StrategyProfitOpen," = ",StrategyProfit+StrategyProfitOpen," of profit\n",

"Server hour: ", TimeHour(CurTime()), " Local hour: ", TimeHour(LocalTime()));

return;

}

//+------------------------------------------------------------------+

//| expert initialization function |

//+------------------------------------------------------------------+

int init()

{

//----

ReportStrategy();

//----

return(0);

}

//+------------------------------------------------------------------+

//| expert deinitialization function |

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| expert start function |

//+------------------------------------------------------------------+

int start()

{

ReportStrategy();

if(Hour() >= close_hour &&

use_close_hour){

// we are after closing time

int totalorders = OrdersTotal();

for(int j=0;j<totalorders;j++){

OrderSelect(j, SELECT_BY_POS, MODE_TRADES);

if(OrderSymbol()==Symbol() &&

OrderMagicNumber() == magic){

if(OrderType() == OP_BUY)

OrderClose(OrderTicket(), OrderLots(), Bid, 0, Red);

if(OrderType() == OP_SELL)

OrderClose(OrderTicket(), OrderLots(), Ask, 0, Red);

if(OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP)

OrderDelete(OrderTicket());

}

}

return(0);

}

if(Hour() == look_price_hour &&

Minute() >= look_price_min &&

clear_to_send){

// Probably I need to close any old positions first:

totalorders = OrdersTotal();

for(j=0;j<totalorders;j++){

OrderSelect(j, SELECT_BY_POS, MODE_TRADES);

if(OrderSymbol()==Symbol() &&

OrderMagicNumber() == magic){

if(OrderType() == OP_BUY)

OrderClose(OrderTicket(), OrderLots(), Bid, 0, Red);

if(OrderType() == OP_SELL)

OrderClose(OrderTicket(), OrderLots(), Ask, 0, Red);

if(OrderType() == OP_BUYSTOP || OrderType() == OP_SELLSTOP)

OrderDelete(OrderTicket());

}

}

}

double PIVOT;

PIVOT = (iHigh(NULL,PERIOD_D1,1) + iLow(NULL,PERIOD_D1,1) + iClose(NULL,PERIOD_D1,1))/3;

// Send orders:

if (clear_to_send){

OrderSend(Symbol(),

OP_BUYSTOP,

lots,

PIVOT+(open_long+Currency_Spread)*Point, // Spread included

slippage,

PIVOT+((open_long+Currency_Spread)-stop_long)*Point,

PIVOT+((open_long+Currency_Spread)+take_profit)*Point,

NULL,

magic,

0,

FireBrick);

OrderSend(Symbol(),

OP_SELLSTOP,

lots,

PIVOT-open_short*Point,

slippage,

PIVOT-(open_short-stop_short)*Point,

PIVOT-(open_short+take_profit)*Point,

NULL,

magic,

0,

FireBrick);

clear_to_send = false; // mark that orders are sent

}

if(!clear_to_send){ // there are active orders

int long_ticket = -1;

int short_ticket = -1;

bool no_active_order = true;

totalorders = OrdersTotal();

for(j=0;j<totalorders;j++){

OrderSelect(j, SELECT_BY_POS, MODE_TRADES);

if(OrderSymbol()==Symbol() &&

OrderMagicNumber() == magic){

if(OrderType() == OP_BUYSTOP)

long_ticket = OrderTicket();

if(OrderType() == OP_SELLSTOP)

short_ticket = OrderTicket();

if(OrderType() == OP_BUY ||

OrderType() == OP_SELL) // Active order

no_active_order = false; }

}

if(short_ticket == -1 && long_ticket != -1)

OrderDelete(long_ticket);

if(long_ticket == -1 && short_ticket != -1)

OrderDelete(short_ticket);

if(long_ticket == -1 && short_ticket == -1 && no_active_order &&

Hour() != look_price_hour && Minute() >= look_price_min)

clear_to_send = true;

if(Hour() == (look_price_hour-1) &&

MathAbs(Minute() - look_price_min) < 10)

clear_to_send = true;

}

//----

return(0);

}

Probieren Sie diesen Code aus.

 

Ryanklefas ,

Sie sind brillant, einfach brillant auf diesem Gebiet.

Die Tests, die ich nach Ihrer Änderung durchgeführt habe, haben funktioniert.

Ich bin mir nicht sicher, warum das Hinzufügen der Pivot-Logik die aktuelle "If"-Logik beeinträchtigt hat. Wahrscheinlich musste ich den Pivot-Code an einer anderen Stelle einrichten. Ich sehe jedoch, wie Sie den Code für die ausstehende Bestellung isoliert haben, und das funktioniert so weit.

Vielen Dank für die URL, die mich auf Code-Beispiele hinweist. Das wird mir bei der Verbesserung meiner Programmierkenntnisse eine große Hilfe sein.

Ich finde es interessant/frustrierend, wie das Lösen eines Problems manchmal ein anderes verursacht.

Aktuelles Problem: Ich muss jetzt herausfinden, warum dieser Code nur schwebende Aufträge für Preise mit 5 Ziffern zulässt und nicht mit 3.

Beispiel: 1,1234 funktioniert gut, aber 1,12 gibt eine Fehlermeldung, dass 1,123333 kein gültiger Preis für OrderSend ist.

Es funktioniert also bei GBP/USD, aber nicht bei USD/JPY.

Nochmals vielen Dank für Ihre Zeit.

 
proverbs:
Ryanklefas ,

Sie sind einfach brillant auf diesem Gebiet.

Ich danke Ihnen.

Was Ihr Problem betrifft:

Stellen Sie sicher, dass Sie die Pivot-Werte, bevor Sie sie an die orderSend-Funktion senden, mit der Funktion NormalizeDouble normiert haben; verwenden Sie den vordefinierten Wert "Digits" als zweiten Parameter, um das Double auf die entsprechende Anzahl von Ziffern für Ihre Währung zu runden.

 
waaustin:
Mein Problem war, wie man den errechneten Wert auf die nächste Dezimalstelle runden kann.

Ich denke, die Funktion normalizeDouble würde auch für Sie funktionieren. Ich habe auch schon Code gesehen, der die Funktionen MathFloor und MathCeiling verwendet, um das Gleiche zu erreichen.

 

Weitere Hilfe

Kann mir jemand sagen, wie man das macht?

Dateien:
chart.gif  18 kb
 
hellkas:
Kann mir jemand sagen, wie man das macht?

Ich glaube, es hängt mit diesem Thema zusammen https://www.mql5.com/en/forum/176969

 

Farbe des Levels im Code einstellen

Kann mir bitte jemand zeigen, wie ich Level1 30 auf Grün und Level2 70 auf Rot setzen kann?

#Eigenschaft indicator_separate_window

#Eigenschaft indicator_buffers 1

#property indicator_color1 DodgerBlue

#Eigenschaft indicator_level1 30

#property indikator_level2 70

#Eigenschaft indicator_minimum 0

#Eigenschaft indicator_maximum 100

Vielen Dank im Voraus

 
highway3000:
Kann mir bitte jemand zeigen, wie ich level1 30 auf Grün und leve2 70 auf Rot setzen kann?

#property indicator_separate_window

#Eigenschaft indicator_buffers 1

#Eigenschaft indicator_color1 DodgerBlue

#Eigenschaft indicator_level1 30

#property indikator_level2 70

#Eigenschaft indicator_minimum 0

#property indicator_maximum 100

Vielen Dank im Voraus

Ich denke, dieser Abschnitt des MetaEditors ist das, was Sie suchen:

MQL4 Referenz - Grundlagen - Präprozessor - Steuerung der Kompilierung