Buon pomeriggio, potete aiutarmi a risolvere un problema: su una candela M15 si aprono diversi trade in fila.
Non voglio che si apra più di un trade. La logica dietro l'EA è che finché l'ordine precedente non viene chiuso, il successivo non si apre, ma a volte una serie di operazioni si apre su una candela così lunga. Si prega di consigliare cosa aggiungere nel codice per evitare questa situazione?
frammento di codice :
In bCheckOrders(), vengono enumerati non solo gli ordini aperti ma anche quelli in sospeso (MODE_TRADES).
Buon pomeriggio, potete aiutarmi a risolvere un problema: su una candela M15 si aprono diversi trade in fila.
Non voglio che si apra più di un trade. La logica dietro l'EA è che finché l'ordine precedente non viene chiuso, il successivo non si apre, ma a volte una serie di operazioni si apre su una candela così lunga. Si prega di consigliare cosa aggiungere nel codice per evitare questa situazione?
Mikhail Toptunov #: Sto solo cercando qualcuno che sia in grado di condividere l'esperienza nell'implementazione dell'integrazione degli indicatori in Expert Advisor
Per poter calcolare questi dati su diverse TF.
Mi chiedo se qualcuno ha un'implementazione attraverso una classe.
Sto cercando di capire la logica delle classi, sarebbe un grande aiuto per imparare.
voidOnTick()
{
// Получим значение индикатора
dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.// Если нет открытых ордеров, то входим в условиеif(bCheckOrders() == true)
{
// Если появился сигнал на покупку, то откроем ордер на покупкуif(bSignalBuy() == true)
vOrderOpenBuy();
// Если появился сигнал на продажу, то откроем ордер на продажуif(bSignalSell() == true)
vOrderOpenSell();
}
// Проверяем, вышел ли текущий баланс по открытому ордеру за вилку из внешних переменных CountLoss и CountProfitif(GetProfitFromStart()>CountProfit || GetProfitFromStart()<CountLoss*-1)
{
// Если да, то закроем ордер по текущей цене, не дожидаясь стопа или тейка
CloseOrder();
}
DrawLABEL("lab_Take",1,5,0,Color(GetProfitFromStart()>0,Lime,Red),StringConcatenate("Profit: ",DoubleToStr(GetProfitFromStart(),2),AC));
}
Prova questo, rimuovi bCheckOrders() da OnTick() e mettilo come evidenziato.
voidOnTick()
{
// Получим значение индикатора
dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.// Если появился сигнал на покупку, то откроем ордер на покупкуif(bSignalBuy() == true)
vOrderOpenBuy();
// Если появился сигнал на продажу, то откроем ордер на продажуif(bSignalSell() == true)
vOrderOpenSell();
// Проверяем, вышел ли текущий баланс по открытому ордеру за вилку из внешних переменных CountLoss и CountProfitif(GetProfitFromStart()>CountProfit || GetProfitFromStart()<CountLoss*-1)
{
// Если да, то закроем ордер по текущей цене, не дожидаясь стопа или тейка
CloseOrder();
}
DrawLABEL("lab_Take",1,5,0,Color(GetProfitFromStart()>0,Lime,Red),StringConcatenate("Profit: ",DoubleToStr(GetProfitFromStart(),2),AC));
}
//+-----------------------------------------------------------------------------------------------+//| Функция открытия ордера на покупку |//+-----------------------------------------------------------------------------------------------+void vOrderOpenBuy()
{
// Если нет открытых ордеров, то входим в условиеif(bCheckOrders() == true)
{
// Тикет ордераint iOTi = 0;
iOTi = OrderSend(Symbol(), OP_BUY, LOT(), Ask, Slippage, 0, 0, "", Magic, 0, clrNONE);
// Проверим открылся ли ордерif(iOTi > 0)
// Есди да, то выставим уровни убытка и прибыли
vOrderModify(iOTi);
else// Если нет, то получим ошибку
vError(GetLastError());
}
}
//+-----------------------------------------------------------------------------------------------+//| Функция открытия ордера на продажу |//+-----------------------------------------------------------------------------------------------+void vOrderOpenSell()
{
// Если нет открытых ордеров, то входим в условиеif(bCheckOrders() == true)
{
// Тикет ордера int iOTi = 0;
iOTi = OrderSend(Symbol(), OP_SELL, LOT(), Bid, Slippage, 0, 0, "", Magic, 0, clrNONE);
// Проверим открылся ли ордерif(iOTi > 0)
// Есди да, то выставим уровни убытка и прибыли
vOrderModify(iOTi);
else// Если нет, то получим ошибку
vError(GetLastError());
}
}
Rimosso il codice non necessario.
Cosa significa?
Per poter calcolare questi dati su diverse TF.
Mi chiedo se qualcuno ha un'implementazione attraverso una classe.
Sto cercando di capire la logica delle classi, sarebbe un grande aiuto per imparare.
Buon pomeriggio, potete aiutarmi a risolvere un problema: su una candela M15 si aprono diversi trade in fila.
Non voglio che si apra più di un trade. La logica dietro l'EA è che finché l'ordine precedente non viene chiuso, il successivo non si apre, ma a volte una serie di operazioni si apre su una candela così lunga. Si prega di consigliare cosa aggiungere nel codice per evitare questa situazione?
frammento di codice :
Ehm... in iOTi in vOrderModify() sempre = 1, non è un biglietto, ma un risultato positivo dell'operazione OrderSend() cioè il valore "1".
Grazie, il codice originale non è mio, quindi non cambio nulla inutilmente. Funziona e funziona.
Questo aiuterà a risolvere il mio problema?
Buon pomeriggio, potete aiutarmi a risolvere un problema: su una candela M15 si aprono diversi trade in fila.
Non voglio che si apra più di un trade. La logica dietro l'EA è che finché l'ordine precedente non viene chiuso, il successivo non si apre, ma a volte una serie di operazioni si apre su una candela così lunga. Si prega di consigliare cosa aggiungere nel codice per evitare questa situazione?
frammento di codice :
Sto solo cercando qualcuno che sia in grado di condividere l'esperienza nell'implementazione dell'integrazione degli indicatori in Expert Advisor
Per poter calcolare questi dati su diverse TF.
Mi chiedo se qualcuno ha un'implementazione attraverso una classe.
Sto cercando di capire la logica delle classi, sarebbe un grande aiuto per imparare.
rates_total = Bars time[] = Time[] open[] = Open[] high[] = High[] low[] = Low[] close[] = Close[]Mostra OnTick()
Grazie, il codice originale non è mio, quindi non cambio nulla inutilmente. Funziona e funziona.
Questo risolve in qualche modo il mio problema?
Prova questo, rimuovi bCheckOrders() da OnTick() e mettilo come evidenziato.
No, mi sono sbagliato, OrderSend() restituisce un biglietto o -1, quindi non c'è niente di sbagliato.
Ok.
Lo terrò presente per il futuro.