Dopo tutte le transazioni OrderSend(), OrderClose(), OrderCloseBy(), OrderModify(), OrderDelete()
Se il mio Expert Advisor viene cancellato dal grafico, non funzionerà, a meno che non lo aggiunga di nuovo manualmente. Come posso resettarlo per farlo funzionare automaticamente?
E questo caso deve essere scritto dopo ogni riga in cui c'è un tentativo di aprire un ordine usando ordersend - giusto?
Se per "questo caso" intendiamo il controllo del volume di ordine minimo e massimo consentito, del passo di volume, del numero massimo consentito di affari+ordine, della sufficienza del margine libero (questi sono i punti principali, per i quali il validatore rifiuta più spesso), allora è più ragionevole scrivere una funzione, chiamandola OrderCheck per esempio. Poi, prima di aprire un nuovo affare, controllate semplicemente il volume. All'incirca così:
Lot=OrderCheck(OP_BUY,Lot);
// или
Lot=OrderCheck(OP_SELL,Lot);
Buon giorno a tutti i cari programmatori! È da un giorno che sto lottando con un problema e non riesco a capirlo. Per favore, aiutatemi a risolverlo.
La linea di fondo:
Lo strumento è RTS futures,periodo di M5;
L'algoritmo deve cambiare i parametri SL e TP a seconda del tempo, e soprattutto, la posizione aperta è chiusa non da TP (request.tp = ....) e l'ordine di mercato contro, se determinate condizioni sono soddisfatte.
Ci sono tre intervalli: 1) (stm.hour>=12 && stm.sec>=1 && stm.hour<=12 && stm.min<=03) // dalle 12:00:01 - 12:03:00
Nell'intervallo "1)" i parametri SL e TP = 200 e 200
Agli intervalli "2)" e "3)", SL e TP = 100 e 100
Il problema: l'algoritmo fissa il profitto SOLO SULLO SWITCH CORRENTE, ma abbiamo bisogno di mantenere la condizione di presa di profitto per n più candele (almeno 10-15) periodo grafico M5
//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+datetime some_time=TimeCurrent();
#define EXPERT_MAGIC 1010// MagicNumber эксперта //+------------------------------------------------------------------+//| Expert initialization function |//+------------------------------------------------------------------+intOnInit()
{
//---//---return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Expert deinitialization function |//+------------------------------------------------------------------+voidOnDeinit(constint reason)
{
//---
}
//+------------------------------------------------------------------+//| Expert tick function |//+------------------------------------------------------------------+//+------------------------------------------------------------------+//| |//+------------------------------------------------------------------+voidOnTick()
{
double Ask = SymbolInfoDouble(NULL, SYMBOL_ASK);
double Bid = SymbolInfoDouble(NULL, SYMBOL_BID);
double SL=0;
double TP=0;
datetime tm=TimeCurrent();
MqlDateTime stm;
TimeToStruct(tm,stm);
bool is_siesta=false;
if (stm.hour>=12 && stm.sec>=1 && stm.hour<=12 && stm.min<=03) // Условия SL и TP работают только в этом интервале времени
{
SL=200/_Point;
TP=200/_Point;
is_siesta=true;
}
else
{
if(((stm.hour>=16 && stm.min>=05 && stm.sec>=1) && (stm.hour<=16 && stm.min<=09)) || (stm.hour>=20 && stm.sec>=11 && stm.hour<=20 && stm.min<=04)) // Условия SL и TP работают только в этих интервалах времени
{
SL=100/_Point;
TP=100/_Point; // тейк профит закрывается кодом
is_siesta=true;
}
else
{
return;
}
}
double Lots=1;
datetime timeBar = iTime(NULL,PERIOD_CURRENT,0);// период можно поставить по своему усмотрениюdatetimestatic timeOpen = 0;
if( (is_siesta==true)&& (timeBar > timeOpen) && ((int)NormalizeDouble(MathAbs(Ask-Bid)/_Point,0)<=50)) // Открывает при условии: - Интервал времени соответствует; - не далее текущей свечи; - спред не более 50пт
{
MqlTradeRequest request= {0};
MqlTradeResult result= {0};
request.action =TRADE_ACTION_DEAL;
request.symbol =Symbol();
request.volume =Lots;
request.type =ORDER_TYPE_BUY;
request.price =SymbolInfoDouble(Symbol(),SYMBOL_ASK);
request.deviation= 5;
request.sl = NormalizeDouble(Ask-SL*_Point,_Digits);
request.magic = 1010;
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError()); // если отправить запрос не удалось, вывести код ошибки
timeOpen = timeBar;
}
if( (is_siesta==true) && (timeBar > timeOpen) && ((int)NormalizeDouble(MathAbs(Ask-Bid)/_Point,0)<=50)) // Открывает при условии: - Интервал времени соответствует; - не далее текущей свечи; - спред не более 50пт
{
MqlTradeRequest request= {0};
MqlTradeResult result= {0};
request.action =TRADE_ACTION_DEAL;
request.symbol =Symbol();
request.volume =Lots;
request.type =ORDER_TYPE_SELL;
request.price =SymbolInfoDouble(Symbol(),SYMBOL_BID);
request.deviation= 5;
request.sl = NormalizeDouble(Bid+SL*_Point,_Digits);
request.magic = 1010;
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError()); // если отправить запрос не удалось, вывести код ошибки
timeOpen = timeBar;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp (для SELL)if((AccountInfoDouble(ACCOUNT_PROFIT)>=TP)&&((int)NormalizeDouble(MathAbs(Bid-Ask)/_Point,0)<=10)) // Закрывает встречным ордером при достижении условий: -прибыль соответствует тейк-профиту; - спред не более 10пт.
{
MqlTradeRequest request= {0};
MqlTradeResult result= {0};
int total=PositionsTotal(); // количество открытых позиций//--- перебор всех открытых позицийfor(int i=total-1; i>=0; i--)
{
//--- параметры ордераulong position_ticket=PositionGetTicket(i); // тикет позицииstring position_symbol=PositionGetString(POSITION_SYMBOL); // символint digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS); // количество знаков после запятойdouble volume=PositionGetDouble(POSITION_VOLUME); // объем позицииulong magic=PositionGetInteger(POSITION_MAGIC);
ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); // тип позицииif((type==POSITION_TYPE_SELL)&& (magic==1010)) // если позиция тип BUY и соотв. магику
{
request.action =TRADE_ACTION_DEAL;
request.symbol =Symbol();
request.volume =Lots;
request.type =ORDER_TYPE_BUY;
request.price =SymbolInfoDouble(Symbol(),SYMBOL_ASK);
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError()); // если отправить запрос не удалось, вывести код ошибки
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp (для BUY)if((AccountInfoDouble(ACCOUNT_PROFIT)>=TP)&&((int)NormalizeDouble(MathAbs(Bid-Ask)/_Point,0)<=10)) // Закрывает встречным ордером при достижении условий: -прибыль соответствует тейк-профиту; - спред не более 10пт.
{
MqlTradeRequest request= {0};
MqlTradeResult result= {0};
int total=PositionsTotal(); // количество открытых позиций//--- перебор всех открытых позицийfor(int i=total-1; i>=0; i--)
{
//--- параметры ордераulong position_ticket=PositionGetTicket(i); // тикет позицииstring position_symbol=PositionGetString(POSITION_SYMBOL); // символint digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS); // количество знаков после запятойdouble volume=PositionGetDouble(POSITION_VOLUME); // объем позицииulong magic=PositionGetInteger(POSITION_MAGIC);
ENUM_POSITION_TYPE type=(ENUM_POSITION_TYPE)PositionGetInteger(POSITION_TYPE); // тип позицииif((type==POSITION_TYPE_BUY)&& (magic==1010)) // если позиция тип BUY и соотв. магику
{
request.action =TRADE_ACTION_DEAL;
request.symbol =Symbol();
request.volume =Lots;
request.type =ORDER_TYPE_SELL;
request.price =SymbolInfoDouble(Symbol(),SYMBOL_BID);
if(!OrderSend(request,result))
PrintFormat("OrderSend error %d",GetLastError()); // если отправить запрос не удалось, вывести код ошибки
}
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////Блок закрытия позиции без тейк-профита request.tp
}
Il problema: l'algoritmo fissa il profitto SOLO SULLO SWITCH CORRENTE, ma abbiamo bisogno di mantenere la condizione di presa di profitto per n-curve (almeno 10-15).
Periodo del grafico M5
L'azione SL e TP è limitata dal tempo nel codice. SL e TP separati per la siesta, e SL e TP separati per la siesta
E questo processo dovrebbe essere scritto dopo ogni riga in cui c'è un tentativo di aprire un ordine usando l'order-send - giusto?
Dopo tutte le transazioni OrderSend(), OrderClose(), OrderCloseBy(), OrderModify(), OrderDelete()
Dopo tutte le transazioni OrderSend(), OrderClose(), OrderCloseBy(), OrderModify(), OrderDelete()
Questo deve essere scritto dopo ogni riga in cui c'è un tentativo di aprire un ordine usando l'order-send - è corretto?
Se si escludono gli errori relativi a
MODE_STOPLEVEL, MODE_TRADEALLOWED, MODE_MINLOT, MODE_LOTSTEP, MODE_MAXLOT
allora i gufi non batteranno il server
Se l'EA viene cancellato dal grafico, non funziona finché non lo carico di nuovo manualmente. Come posso resettarlo automaticamente?
E questo caso deve essere scritto dopo ogni riga in cui c'è un tentativo di aprire un ordine usando ordersend - giusto?
Se per "questo caso" intendiamo il controllo del volume di ordine minimo e massimo consentito, del passo di volume, del numero massimo consentito di affari+ordine, della sufficienza del margine libero (questi sono i punti principali, per i quali il validatore rifiuta più spesso), allora è più ragionevole scrivere una funzione, chiamandola OrderCheck per esempio.
Poi, prima di aprire un nuovo affare, controllate semplicemente il volume.
All'incirca così:
Buon giorno a tutti i cari programmatori! È da un giorno che sto lottando con un problema e non riesco a capirlo. Per favore, aiutatemi a risolverlo.
La linea di fondo:
Lo strumento è RTS futures,periodo di M5;
L'algoritmo deve cambiare i parametri SL e TP a seconda del tempo, e soprattutto, la posizione aperta è chiusa non da TP (request.tp = ....) e l'ordine di mercato contro, se determinate condizioni sono soddisfatte.
Ci sono tre intervalli: 1) (stm.hour>=12 && stm.sec>=1 && stm.hour<=12 && stm.min<=03) // dalle 12:00:01 - 12:03:00
2) (stm.hour>=16 && stm.min>=05 && stm.sec>=1) && (stm.hour<=16 && stm.min<=09) // 16:05:01 - 16:09:00
3) (stm.hour>=20 && stm.sec>=11 && stm.hour<=20 && stm.min<=04) // 20:00:11 - 20:04:00
Nell'intervallo "1)" i parametri SL e TP = 200 e 200
Agli intervalli "2)" e "3)", SL e TP = 100 e 100
Il problema: l'algoritmo fissa il profitto SOLO SULLO SWITCH CORRENTE, ma abbiamo bisogno di mantenere la condizione di presa di profitto per n più candele (almeno 10-15)
periodo grafico M5
Alexey Belyakov:
Il problema: l'algoritmo fissa il profitto SOLO SULLO SWITCH CORRENTE, ma abbiamo bisogno di mantenere la condizione di presa di profitto per n-curve (almeno 10-15).
Periodo del grafico M5
L'azione SL e TP è limitata dal tempo nel codice. SL e TP separati per la siesta, e SL e TP separati per la siesta
Buon giorno a tutti i cari programmatori! È da un giorno che sto lottando con un problema e non riesco a capirlo. Per favore, aiutatemi a risolverlo.
Si può cambiare il tempo di esecuzione e il numero di barre
Grazie mille MakarFX! Ora funziona come dovrebbe!
Prego)