DanilaMactep: Если эксперт с графика удалиться то пока я его опять вручную не закину он не будет работать. Каким образом возобновить его работу автоматически?
Автоматически никак, это для того чтоб исправить ошибку
И это дело надо пописать после каждой строки в которой есть попытка открыть ордер с помощью ордерсенд- правильно?
Если под "этим делом" имеется в виду проверка минимального и максимально допустимого объема сделки, шага объема, максимально допустимого количества сделки+ордера, достаточность свободной маржи (это основные пункты, по которым валидатор чаще всего дает отлуп), то рациональнее Один Раз написать Одну Функцию, обозвав ее OrderCheck например. Потом, перед открытием любой новой сделки, просто проверять объем. Примерно так:
Lot=OrderCheck(OP_BUY,Lot);
// или
Lot=OrderCheck(OP_SELL,Lot);
Всем доброго дня уважаемые программисты.! Вот уже который день бьюсь с одной задачей, не могу понять. Помогите пожалуйста решить.
Суть в чём:
Инструмент: фьючь RTS; Период графика M5;
Алгоритм должен изменять параметры SL и TP в зависимости от времени.Причём важно - открытая позиция закрывается не по TP ( request.tp = ....) а встречным рыночным ордером при достижении определённых условий.
Даны три интервала времени: 1) (stm.hour>=12 && stm.sec>=1 && stm.hour<=12 && stm.min<=03) // с 12:00:01 - 12:03:00
В интервале "2)" и "3)" параметры SL и TP = 100 и 100
Проблема: Алгоритм фиксирует прибыль ТОЛЬКО НА ТЕКУЩЕЙ СВЕЧЕ , а нужно, чтобы условие фиксации прибыли сохранялось ещё n-свечей. (как минимум 10-15) Период графика 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
}
Для авторизации и пользования сайтом MQL5.com необходимо разрешить использование файлов Сookie.
Пожалуйста, включите в вашем браузере данную настройку, иначе вы не сможете авторизоваться.
Вы вошли в аккаунт. Двухфакторная аутентификация отключена. Настройте её заново и отсканируйте новый QR-код или продолжите с отключённой двухфакторной аутентификацией.
И это дело надо пописать после каждой строки в которой есть попытка открыть ордер с помощью ордерсенд- правильно?
После всех торговых операций OrderSend(), OrderClose(), OrderCloseBy(), OrderModify(), OrderDelete()
После всех торговых операций OrderSend(), OrderClose(), OrderCloseBy(), OrderModify(), OrderDelete()
И это дело надо пописать после каждой строки в которой есть попытка открыть ордер с помощью ордерсенд- правильно?
Если исключить ошибки связанные с
MODE_STOPLEVEL, MODE_TRADEALLOWED, MODE_MINLOT, MODE_LOTSTEP, MODE_MAXLOT
то сов не будет долбить сервер
Если эксперт с графика удалиться то пока я его опять вручную не закину он не будет работать. Каким образом возобновить его работу автоматически?
И это дело надо пописать после каждой строки в которой есть попытка открыть ордер с помощью ордерсенд- правильно?
Если под "этим делом" имеется в виду проверка минимального и максимально допустимого объема сделки, шага объема, максимально допустимого количества сделки+ордера, достаточность свободной маржи (это основные пункты, по которым валидатор чаще всего дает отлуп), то рациональнее Один Раз написать Одну Функцию, обозвав ее OrderCheck например.
Потом, перед открытием любой новой сделки, просто проверять объем.
Примерно так:
Всем доброго дня уважаемые программисты.! Вот уже который день бьюсь с одной задачей, не могу понять. Помогите пожалуйста решить.
Суть в чём:
Инструмент: фьючь RTS; Период графика M5;
Алгоритм должен изменять параметры SL и TP в зависимости от времени.Причём важно - открытая позиция закрывается не по TP ( request.tp = ....) а встречным рыночным ордером при достижении определённых условий.
Даны три интервала времени: 1) (stm.hour>=12 && stm.sec>=1 && stm.hour<=12 && stm.min<=03) // с 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
В интервале "1)" параметры SL и TP = 200 и 200
В интервале "2)" и "3)" параметры SL и TP = 100 и 100
Проблема: Алгоритм фиксирует прибыль ТОЛЬКО НА ТЕКУЩЕЙ СВЕЧЕ , а нужно, чтобы условие фиксации прибыли сохранялось ещё n-свечей. (как минимум 10-15)
Период графика M5
Alexey Belyakov:
Проблема: Алгоритм фиксирует прибыль ТОЛЬКО НА ТЕКУЩЕЙ СВЕЧЕ , а нужно, чтобы условие фиксации прибыли сохранялось ещё n-свечей. (как минимум 10-15)
Период графика M5
В коде действие SL и TP ограничено временем, сделай для сиесты отдельно и для SL и TP отдельно
Всем доброго дня уважаемые программисты.! Вот уже который день бьюсь с одной задачей, не могу понять. Помогите пожалуйста решить.
Сможешь менять время работы и количество баров
Cпасибо Большое MakarFX ! Теперь работает как надо!
Пожалуйста)