![MQL5 - Linguaggio delle strategie di trading integrato nel client terminal MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
Ti stai perdendo delle opportunità di trading:
- App di trading gratuite
- Oltre 8.000 segnali per il copy trading
- Notizie economiche per esplorare i mercati finanziari
Registrazione
Accedi
Accetti la politica del sito e le condizioni d’uso
Se non hai un account, registrati
Bisogno di aiuto.
http://forum.mql4.com/ru/67309#1011467
Si prega di avvisare: gli ordini non vengono aperti ogni giorno il trawling non funziona e gli ordini aperti vengono chiusi non secondo il TP. Cosa sto facendo di sbagliato?
input int StartHour = 23; // Время ачало торговли
input int TakeProfit = 40; // TakeProfit
input int StopLoss = 40; // StopLoss
input int Lots = 0.1; // Лот для торговли
input int Magic = 22; // Магическое число
input int Trals = 20; // Дистанция тралинга в пунктах
input int _Step = 1; // Шаг
input bool _StepUse = true; // Использовать шаг или нет
void OnTick()
{
static bool IsFirstTick = false;
static int ticket = 0;
double lot=Lot_Normalize(Symbol(),Lots,1);
double sl= Dist_Normalize(Symbol(),Trals);
double step= Dist_Normalize(Symbol(),_Step);
int h= TimeHour(TimeCurrent());
if(h == StartHour)
{
Alert("TimeHor: ", h);
if (IsFirstTick == true)
IsFirstTick = false;
bool res;
res= OrderSelect(ticket, SELECT_BY_TICKET);
if(res == true)
{
if(OrderCloseTime() == 0)
{
bool res2;
res2 = OrderClose(ticket, Lots, OrderClosePrice(), 10);
if(res2 == false)
{
Alert("Error Closing Order #", ticket);
} Alert("Closing Order #", ticket);
}
}
if(Open[0] < Open[StartHour])
{
ticket = OrderSend(Symbol(), OP_BUYLIMIT, Lots, High[1],10, Low[1]-StopLoss*Point, High[1]+TakeProfit*Point,"Set bu ForexRobot");
Tralling_Stop(OrderSymbol(),Magic,sl,step,_StepUse);
if(ticket < 0)
{
Alert("Error Sending Order!");
} Alert("Sending Order! BUY_LIMIT");
}
else
{
ticket = OrderSend(Symbol(), OP_SELLLIMIT, Lots, Low[1],10, High[1]+StopLoss*Point, Low[1]+TakeProfit*Point,"Set bu ForexRobot");
Tralling_Stop(OrderSymbol(),Magic,sl,step,_StepUse);
if(ticket < 0)
{
Alert("Error Sending Order!");
} Alert("Sending Order! SEL_LLIMIT");
}
}
}
double Dist_Normalize(string Smv, int _Distancia)
{
int Dig= int(MarketInfo(Smv,MODE_DIGITS));
double Pip=MarketInfo(Smv,MODE_POINT);
if(Dig==3 || Dig==5)
return NormalizeDouble(_Distancia*10*Pip,Dig);
else return NormalizeDouble(_Distancia*Pip,Dig);
}
double Lot_Normalize(string Smv, double _lot, double _mult)
{
double minlot=MarketInfo(Smv,MODE_MINLOT);
double maxlot=MarketInfo(Smv,MODE_MAXLOT);
double steplot=MarketInfo(Smv,MODE_LOTSTEP);
double lot= _lot*_mult;
if(lot<=minlot) lot+minlot;
else if(lot>=maxlot) lot=minlot;
else if(lot>minlot && lot<maxlot)
{
int k=int((lot-minlot)/steplot);
lot=NormalizeDouble(minlot+k*steplot,2);
}
return(lot);
}
void Tralling_Stop(string Smv, int _Magic, double _Tral, double _Step, bool _Step_Use)
{
int Dig=int(MarketInfo(_Symbol,MODE_DIGITS));
for(int pos=OrdersTotal()-1; pos>=0;pos--)
{
if(OrderSelect(pos,SELECT_BY_POS,MODE_TRADES) && OrderSymbol()==Smv &&
OrderMagicNumber()==_Magic && OrderType()<2)
{
double SLPrice;
if(OrderType()==OP_BUY)
{
if(_Step_Use)
{
RefreshRates();
if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral+_Step,Dig))
{
SLPrice=NormalizeDouble(Ask-_Tral,Dig);
if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
Alert("Error modifi Order!: ",GetLastError());
}
}
else
{
RefreshRates();
if(NormalizeDouble(Ask-OrderStopLoss(),Dig)>NormalizeDouble(_Tral,Dig))
{
SLPrice=NormalizeDouble(Bid+_Tral,Dig);
if(!OrderModify(OrderTicket(),0,SLPrice,OrderTakeProfit(),OrderExpiration(),clrRed))
Alert("Error modifi Order!: ",GetLastError());
}
}
}
}
}
}
Si prega di avvisare: gli ordini non vengono aperti ogni giorno il trawling non funziona e gli ordini aperti vengono chiusi non secondo il TP. Cosa sto facendo di sbagliato?
input int StartHour = 23; // Время ачало торговли
input int TakeProfit = 40; // TakeProfit
input int StopLoss = 40; // StopLoss
input int Lots = 0.1; // Лот для торговли
input int Magic = 22; // Магическое число
input int Trals = 20; // Дистанция тралинга в пунктах
input int _Step = 1; // Шаг
input bool _StepUse = true; // Использовать шаг или нет
void OnTick()
{
......
IsFirstTick = false;
Sostituirei questo pezzo con
Dove la variabile TM è dichiarata come DateTime fuori dalla funzione OnTick(), cioè è globale per questo modulo.
Non capisco questo codice: if(Open[0] < Open[StartHour])
Lo StartHour è uguale a 23 e suggerisce che il prezzo aperto della barra zero sarà confrontato con il prezzo aperto della 23a barra precedente. Beh, ok, forse è un trucco dell'Expert Advisor.
Ma questo design non è affatto appropriato.
Cosa succede se la variabile ticket è uguale a zero, o se l'EA è stato reinizializzato e questa variabile è stata resettata per default?
Lo StartHour è l'ora in cui l'EA dovrebbe lavorare. Dovrebbe essere l'una di notte. Perché la pesca a strascico non funziona?
Bisogna analizzare il codice per capire perché non funziona.
Provate a inserire lafunzione Print("Tralling_Stop") nella funzioneTralling_Stop(), e vedete se questo messaggio (Tralling_Stop) appare nel log, se no, allora questa funzione non viene chiamata. Se ce l'avete, analizzate la funzione Tralling_Stop() stessa, forse contiene qualche errore logico.
In generale, ovunque ci siano condizioni logiche if, inserire Print(" condizione 1" ), Print(" condizione 2" ), ecc. Esegui l'Expert Advisor nello strategy tester e nel diario puoi tracciare la logica del tuo EA.
Bisogna analizzare il codice per capire perché non funziona.
Provate a inserire lafunzione Print("Tralling_Stop") nella funzioneTralling_Stop(), e vedete se questo messaggio (Tralling_Stop) appare nel log, se no, allora questa funzione non viene chiamata. Se sì, analizzate la funzione Tralling_Stop() stessa - forse ci sono alcuni errori logici in essa.
In generale, ovunque ci siano condizioni logiche if, inserire Print(" condizione 1" ), Print(" condizione 2" ), ecc. Esegui l'Expert Advisor nello Strategy Tester e nel log puoi tracciare la logica del tuo EA.
Ho provato a riscriverlo, ma ancora non funziona come ho bisogno. Gli ordini non vengono aperti quando voglio io, quindi non sono trillati. Secondo l'idea, l'Expert Advisor dovrebbe funzionare in questo modo: alla chiusura dell'ultima candela in un giorno (alle 00:00) dovrebbe aprire due ordini pendenti: High (per comprare) e Low (per vendere) e poi semplicemente trillarli.
input int StartHour = 1; // Начало торговли
input int TakeProfit = 40; // TakeProfit
input int StopLoss = 10; // StopLoss
extern double Lots = 0.1; // Лот для торговли
input int Magic = 22; // Магическое число
input int Trals = 5; // Дистанция тралинга в пунктах
input int _Step = 1; // Шаг
input bool _StepUse = false; // Использовать шаг или неT
void OnTick()
{
static bool IsFirstTick = false;
Trailing();
if (StartHour != Hour()) { return;}
if (OrdersTotal()>0)
{
OrderSend(Symbol(), OP_BUYLIMIT, Lots, High[1],10, Low[1]-StopLoss*Point, High[1]+TakeProfit*Point,"Set bu ForexRobot",Magic);
OrderSend(Symbol(), OP_SELLLIMIT, Lots, Low[1],10, High[1]+StopLoss*Point, Low[1]+TakeProfit*Point,"Set bu ForexRobot",Magic);
}
}
//+------------------------------------------------------------------+
void Trailing()
{
if (_StepUse)
{
for (int trall=0; trall<OrdersTotal(); trall++) {
if (!(OrderSelect(trall, SELECT_BY_POS, MODE_TRADES))) continue;
if (OrderSymbol() != Symbol()) continue;
if (OrderType() == OP_BUY ) {
if (Bid-OrderOpenPrice() > StopLoss*Point || OrderMagicNumber()==Magic) {
if (OrderStopLoss() < Bid-(StopLoss+_Step-1)*Point || OrderStopLoss() == 0) {
OrderModify(OrderTicket(), OrderOpenPrice(), Bid-StopLoss*Point, OrderTakeProfit(), 0, Blue);
}
}
}
if (OrderType() == OP_SELL) {
if (OrderOpenPrice()-Ask > StopLoss*Point || OrderMagicNumber()==Magic) {
if (OrderStopLoss() > Ask+(StopLoss+_Step-1)*Point || OrderStopLoss() == 0) {
OrderModify(OrderTicket(), OrderOpenPrice(), Ask+StopLoss*Point, OrderTakeProfit(), 0, Blue);
}
}
}
}
}
}
//+------------------------------------------------------------------+
Prova
Sostituire con:
Sostituire con:
Inoltre, i prezzi devono essere normalizzati usando NormalizeDouble(). Cioè, invece diLow[1]-StopLoss*Point dovete scrivere NormalizeDouble(Low[1]-StopLoss*Point,Digits()).
Inoltre, secondo il tuo codice, se la variabile _StepUse è uguale a false, il tuo trailing stop non funzionerà. Guardate attentamente il codice della funzione Trailing()
Prova
Sostituire con:
Sostituire con:
Inoltre, i prezzi devono essere normalizzati usando NormalizeDouble(). Cioè, invece diLow[1]-StopLoss*Point dovete scrivere NormalizeDouble(Low[1]-StopLoss*Point,Digits()).
Inoltre, secondo il tuo codice, se la variabile _StepUse è uguale a false, il tuo trailing stop non funzionerà. Guardate attentamente il codice della funzione Trailing().
Siete in contatto? Inviami un messaggio a http://vk.com/computerwizard116. Non so più come risolvere il problema EA. Sul mio conto demo ho lavorato su questa strategia per una settimana
E funziona. E nei test, questo mascalzone non chiude nemmeno l'ordine al punto di takeout(((((( Nella foto, si può vedere che il prezzo è andato oltre il punto di takeout ed è tornato indietro, ma ha chiuso in perdita, dannazione !((((
Perché lo fa?
Siete in contatto? Mandatemi un'e-mail a http://vk.com/computerwizard116. Non so più come risolvere il problema EA. Ho usato questa strategia per una settimana su un conto demo
e funziona. Ma quando si prova, questo mascalzone non chiude nemmeno l'ordine a takeaway. (((((( Nella foto, si può vedere il prezzo è andato oltre il takeaway ed è tornato indietro, ma ha chiuso in perdita.
Perché lo fa?
Non sono in contatto.
Gliordini Take profit e Stop loss non dipendono dal consulente, vengono eseguiti sul server del broker. L'EA imposta solo il take profit e lo stop loss, non li esegue. Controlla se il take profit è già stato impostato dopo che il prezzo ha raggiunto questo valore. In altre parole, l'ordine è stato aperto prima, e poi il prezzo si muoveva avanti e indietro, e poi è stato impostato il take profit.
Non sono in contatto.
L'esecuzione degli ordini di take profit e stop loss non dipende dall'EA, vengono eseguiti sul server del broker. L'EA imposta solo gli ordini take e stop, non li esegue. Controlla se il take profit è già stato impostato dopo che il prezzo ha raggiunto questo valore. In altre parole, prima è stato aperto l'ordine, poi il prezzo è andato avanti e indietro, e poi è stato impostato il take profit.