Fragen Sie! - Seite 106

 

Zeitspanne des Diagramms

Wie lautet der Code, um herauszufinden, in welchem Zeitraum das Diagramm läuft? So kann ich die Variableneinstellungen für jede Zeitperiode ändern.

if(?????) . . .

Dave

 
Dave137:
Wie lautet der Code, um herauszufinden, in welchem Zeitraum das Diagramm läuft? So kann ich die Variableneinstellungen für jede Zeitperiode ändern.

if(?????) . . .

Dave
if(Period() == PERIOD_M15) ...

[/PHP]

or:

switch(Period())

{

case PERIOD_M1:

...

break;

case PERIOD_M5:

...

break;

...

}

[/PHP]

Sometime it maybe easier to work with indices:[PHP]

int tfIndex = ArrayBsearch({PERIOD_M1, PERIOD_M5, PERIOD_M15, ...}, Period());

Example : how to display the period by the string you want:[PHP]

int Periods[] = {PERIOD_M1, PERIOD_M5, PERIOD_M15, ...};

string sPeriods[] = {" M1", " M5", " M15", " M30", " Hourly", " 4 hours", " Daily", " Weekly"...};

int tfIndex = ArrayBsearch(Periods, Period());

comment(Symbol() + sPeriods[tfIndex]);

 

Danke, Michel!

Ich hoffe, dass dieser EA, den ich kreiere, der Richtige sein wird! Ich schätze Ihre Hilfe sehr!

Dave

 

Hallo zusammen!

kann mir jemand hier helfen, diese Funktion hinzuzufügen. Machen Sie es, um den Handel zu schließen, wenn der Balken abgeschlossen ist oder in einem anderen Wort, um es den Handel zu schließen, wenn der nächste Balken erscheint (egal, der Handel ist Gewinn oder Verlust)

extern int SystemMagicNumber=197;

extern double TakeProfit = 100;

extern double StopLoss = 500;

extern double Lots=0.1;

extern double TrailingStop = 0;

extern int MaxBuyTrades=5;

extern int MaxSellTrades=5;

int start()

{

if( HavePosThisBar(SystemMagicNumber)==false

&&iMA(NULL,0,5,0,MODE_SMA, PRICE_CLOSE,1)<iMA(NULL,0,15,0,MODE_EMA, PRICE_CLOSE,1)

&& iMA(NULL,0,5,0,MODE_SMA, PRICE_CLOSE,2)>iMA(NULL,0,15,0,MODE_EMA, PRICE_CLOSE,2)

&& SellPositionsCount()<MaxSellTrades

)

{

OrderSend(Symbol(),OP_SELL,Lots,Bid,0,Bid+StopLoss*Point,Bid-TakeProfit*Point,"",SystemMagicNumber,0,Red);

return(0);

}

if( HavePosThisBar(SystemMagicNumber)==false

&& iMA(NULL,0,5,0,MODE_SMA, PRICE_CLOSE,1)>iMA(NULL,0,15,0,MODE_EMA, PRICE_CLOSE,1)

&& iMA(NULL,0,5,0,MODE_SMA, PRICE_CLOSE,2)<iMA(NULL,0,15,0,MODE_EMA, PRICE_CLOSE,2)

&& BuyPositionsCount()<MaxBuyTrades

)

{

OrderSend(Symbol(),OP_BUY,Lots,Ask,0,Ask-StopLoss*Point,Ask+TakeProfit*Point,"",SystemMagicNumber,0,Blue);

return(0);

}

for(int cnt=OrdersTotal()-1;cnt>=0;cnt--)

{

OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES);

if (AuftragSymbol() == Symbol())

{

if (OrderType()==OP_SELL)

{

wenn (NachlaufenderStopp>0)

{

wenn (OrderOpenPrice()-Ask>TrailingStop*Point)

{

if (OrderStopLoss() == 0 || OrderStopLoss()>(Ask+Point*TrailingStop))

{

OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*TrailingStop,OrderTakeProfit(),0,Purple);

return(0);

}

}

}

}

if (OrderType()==OP_BUY)

{

wenn (NachlaufenderStopp>0)

{

wenn (Bid-OrderOpenPrice()>TrailingStop*Point)

{

wenn (OrderStopLoss()<(Bid-Point*TrailingStop))

{

OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*TrailingStop,OrderTakeProfit(),0,Yellow);

return(0);

}

}

}

}

}

}

//----

return(0);

}

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

bool HavePosThisBar(int magic)

{

int cnt;

bool Ergebnis=false;

for(cnt=0; cnt<=OrdersHistoryTotal()-1; cnt++)

if(OrderSelect(cnt, SELECT_BY_POS, MODE_HISTORY))

if((OrderSymbol() == Symbol()) &&(OrderMagicNumber() == magic) && Time[0]<=OrderOpenTime())

{

Ergebnis=true;

break;

}

for(cnt=0; cnt<=OrdersTotal()-1; cnt++)

if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))

if((OrderSymbol() == Symbol()) &&(OrderMagicNumber() == magic) && Time[0]<=OrderOpenTime())

{

Ergebnis=true;

break;

}

return(Ergebnis);

}

int BuyPositionsCount()

{

int Ergebnis=0;

for(int cnt=0; cnt<=OrdersTotal()-1; cnt++)

if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))

if((OrderSymbol() == Symbol()) &&(OrderMagicNumber() == SystemMagicNumber) &&

(OrderType()==OP_BUY)

)

{

Ergebnis++;

}

return(Ergebnis);

}

int SellPositionsCount()

{

int Ergebnis=0;

for(int cnt=0; cnt<=OrdersTotal()-1; cnt++)

if(OrderSelect(cnt, SELECT_BY_POS, MODE_TRADES))

if((OrderSymbol() == Symbol()) &&(OrderMagicNumber() == SystemMagicNumber) &&

(OrderType()==OP_SELL)

)

{

Ergebnis++;

}

return(Ergebnis);

}

 
bearfoot090:
Hallo zusammen!

Kann mir jemand hier helfen, diese Funktion hinzuzufügen. Machen Sie es, um den Handel zu schließen, wenn der Balken abgeschlossen ist oder in einem anderen Wort, um es den Handel zu schließen, wenn der nächste Balken erscheint (egal, der Handel ist Gewinn oder Verlust).

Um einen neuen Balken zu erkennen, gibt es mehrere Lösungen:

1)

if(Volume[0] == 1) CloseOrders(); [/PHP] Not very reliable, for example if the terminal has to be restarted you may loose the first tick of the bar.

2)

if(BarsCnt < Bars) {BarsCnt = Bars; CloseOrders();}[/PHP] Not very reliable, for example if new bars are added to the left of the chart.

3)

if(Time1 < Time[0]) {Time1 = Time[0]; CloseOrders();}

Better, but again, restarting the terminal may produce wrong behaviors.

So my opinion is that the best is to write the lifetime max of each order into the order itself, using the "Comment" field :[PHP]OrderSend(..., ""+(Time[0] + Period()*60), ..);
Then you can scan the orders and check :[PHP]if(TimeCurrent() > OrderComment()) OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0, CLR_NONE);

. Dies ist eine gute Lösung, denn wenn Sie mehrere Aufträge zu schließen haben, haben Sie alle Zeit, um es zu tun.

 

danke michel für die antwort.

Ich werde es versuchen. aber was soll ich in den Kommentar schreiben?irgendetwas, das mir gefällt?

 
bearfoot090:
danke michel für die antwort. ich werde es versuchen. aber was soll ich in das Kommentarfeld schreiben? irgendetwas, das mir gefällt?

Geben Sie die Zeit ein, zu der Sie den Auftrag abschließen möchten. Das Feld Kommentar muss eine Zeichenkette sein, deshalb steht vor dem Wert ein ""+". zum Beispiel:

""+(Time[0] + Period()*60) // begin of the next bar on the current timeframe

""+(TimeCurrent() + 2*360 + 30*60) // 2 hours 30 minutes after the openning

""+(iTime(NULL,PERIOD_D1,0) + 23*360 + 45*60) // today at 23:45 (server time)

""+(iTime(NULL,PERIOD_W1,0) + (PERIOD_W1 - 10)*60) // next friday at 23:50
 

Danke

Michel:
Prüfen Sie bei Bedarf zuerst, ob Sie später als 8 Uhr morgens sind:
if(Hour() < 8) return;[/PHP]

Then, find the max and min of the current day. (if its ok for you, its easier than from 8 am): [PHP]double Max = iHigh(Symbol(), PERIOD_D1, 0);

double Min = iLow(Symbol(), PERIOD_D1, 0);

int Range = (Max - Min) / Point;

if(Range > 90) return;

...

Hallo,

Entschuldigung, dass es so lange gedauert hat, bis ich mich bei Ihnen bedankt habe.

Ich schätze Ihre Hilfe sehr.

Nochmals vielen Dank.

Shek

 
Michel:
Um einen neuen Balken zu erkennen, gibt es mehrere Lösungen:

1)

if(Volume[0] == 1) CloseOrders(); [/PHP] Not very reliable, for example if the terminal has to be restarted you may loose the first tick of the bar.

2)

if(BarsCnt < Bars) {BarsCnt = Bars; CloseOrders();}[/PHP] Not very reliable, for example if new bars are added to the left of the chart.

3)

if(Time1 < Time[0]) {Time1 = Time[0]; CloseOrders();}[/PHP] Better, but again, restarting the terminal may produce wrong behaviors.

So my opinion is that the best is to write the lifetime max of each order into the order itself, using the "Comment" field :

OrderSend(..., ""+(Time[0] + Period()*60), ..);[/PHP] Then you can scan the orders and check :[PHP]if(TimeCurrent() > OrderComment()) OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0, CLR_NONE);
. This is a good solution because if you have several orders to close, you have all the time needed to do it.

i got the error below.what does ot mean?

[PHP]'>' - different types in comparison F:\Program Files\MetaTrader - FXOpen\experts\EMA_10.mq4 (88, 22)

I make it like this

for the send order

[PHP]OrderSend(Symbol(),OP_BUY,Lots,Ask,0,Ask-25*Point,Ask+TakeProfit*Point, ""+(Time[0] + Period()*60),SystemMagicNumber,0,Blue);

und für den Abschlussauftrag

[PHP]if(TimeCurrent() > OrderComment())

{

OrderClose(OrderTicket(), OrderLots(), OrderClosePrice(), 0, CLR_NONE);

}

und ich bekomme den oben gezeigten Fehler.

Ist das richtig?

 

mein Fehler, sorry.

Dies sollte funktionieren:

if(TimeCurrent() > StringToInteger(OrderComment())