Após todas as negociações OrderSend(), OrderClose(), OrderCloseBy(), OrderModify(), OrderDelete()
Se meu Expert Advisor for excluído do gráfico, ele não funcionará, a menos que eu o acrescente manualmente novamente. Como faço para reinicializar para funcionar automaticamente?
E este caso deve ser escrito após cada linha em que há uma tentativa de abrir um pedido usando o orderend - certo?
Se por "este caso" entendemos a verificação do volume mínimo e máximo de pedidos permitidos, etapa de volume, número máximo permitido de negócios+ordem, suficiência de margem livre (estes são os pontos principais, para os quais o validador rejeita mais frequentemente), então é mais razoável escrever uma função, chamando-a OrderCheck, por exemplo. Então, antes de abrir qualquer novo negócio, basta verificar o volume. Aproximadamente assim:
Lot=OrderCheck(OP_BUY,Lot);
// или
Lot=OrderCheck(OP_SELL,Lot);
Bom dia a todos os caros programadores! Há um dia que estou lutando com um problema e não consigo resolvê-lo. Por favor, ajude-me a resolvê-lo.
O resultado final:
O instrumento é RTS futures,período de M5;
Algoritmo tem que mudar os parâmetros SL e TP dependendo do tempo, e o mais importante, a posição aberta é fechada não por TP ( request.tp = ....) e a ordem do mercado de balcão, se certas condições forem atendidas.
Há três intervalos: 1) (stm.hour>=12 && stm.sec>==1 && stm.hour<=12 && stm.stm.min<=03) // de 12:00:01 - 12:03:00
O problema: O algoritmo fixa o lucro SOMENTE NA CORRENTE, mas precisamos manter a condição de obtenção de lucro para n mais castiçais (pelo menos 10-15) período do gráfico 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
}
E este processo deve ser escrito após cada linha em que há uma tentativa de abrir um pedido usando o envio do pedido - certo?
Após todas as negociações OrderSend(), OrderClose(), OrderCloseBy(), OrderModify(), OrderDelete()
Após todas as negociações OrderSend(), OrderClose(), OrderCloseBy(), OrderModify(), OrderDelete()
Isto tem que ser escrito após cada linha em que há uma tentativa de abrir um pedido usando o envio do pedido - isto é correto?
Se excluirmos erros relacionados a
MODE_STOPLEVEL, MODE_TRADEALLOWED, MODE_MINLOT, MODE_LOTSTEP, MODE_MAXLOT
então as corujas não estarão batendo no servidor
Se a EA for excluída da tabela, ela não funcionará até que eu a reinserir manualmente. Como posso redefini-lo automaticamente?
E este caso deve ser escrito após cada linha em que há uma tentativa de abrir um pedido usando o orderend - certo?
Se por "este caso" entendemos a verificação do volume mínimo e máximo de pedidos permitidos, etapa de volume, número máximo permitido de negócios+ordem, suficiência de margem livre (estes são os pontos principais, para os quais o validador rejeita mais frequentemente), então é mais razoável escrever uma função, chamando-a OrderCheck, por exemplo.
Então, antes de abrir qualquer novo negócio, basta verificar o volume.
Aproximadamente assim:
Bom dia a todos os caros programadores! Há um dia que estou lutando com um problema e não consigo resolvê-lo. Por favor, ajude-me a resolvê-lo.
O resultado final:
O instrumento é RTS futures,período de M5;
Algoritmo tem que mudar os parâmetros SL e TP dependendo do tempo, e o mais importante, a posição aberta é fechada não por TP ( request.tp = ....) e a ordem do mercado de balcão, se certas condições forem atendidas.
Há três intervalos: 1) (stm.hour>=12 && stm.sec>==1 && stm.hour<=12 && stm.stm.min<=03) // de 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
No intervalo "1)" parâmetros SL e TP = 200 e 200
Em intervalos "2)" e "3)", SL e TP = 100 e 100
O problema: O algoritmo fixa o lucro SOMENTE NA CORRENTE, mas precisamos manter a condição de obtenção de lucro para n mais castiçais (pelo menos 10-15)
período do gráfico M5
Alexey Belyakov:
O problema: O algoritmo fixa o lucro SOMENTE NA CORRENTE, mas precisamos manter a condição de obtenção de lucro para n-curvas (pelo menos 10-15).
Período do gráfico M5
A ação SL e TP é limitada no código. Separar SL e TP para siesta, e separar SL e TP para siesta
Bom dia a todos os caros programadores! Há um dia que estou lutando com um problema e não consigo resolvê-lo. Por favor, ajude-me a resolvê-lo.
Você pode mudar o tempo de funcionamento e o número de barras
Muito obrigado MakarFX ! Agora funciona como deveria !
De nada)