В графе Эксперты: 2018.05.14 12:08:17.578ЛИМИТ (Si-6.18,M15)Alert: 10009, больше ничего нет
Ну вот как Вам помочь? Сначала Вы пишете, что не выставляется Sell Limit, приводите выдержки из лога. Теперь же речь идет уже об ордере Buy Limit. Выходит, что проблема какая-то плавающая. Кроме того, ни разу не привели стейтмента. Вы ведь утверждаете, что в реальности ордера не видно. А стейтмент может помочь в прояснении ситуации.
voidOnStart()
{MqlTradeRequest request={0};
MqlTradeResult result={0};
doubleBid=SymbolInfoDouble(Symbol(),SYMBOL_BID);
doubleAsk=SymbolInfoDouble(Symbol(),SYMBOL_ASK);
int digits=SymbolInfoInteger(_Symbol,SYMBOL_DIGITS);
double p=NormalizeDouble(ChartPriceOnDropped(),digits);
if( SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE)==10)
{p=MathRound(ChartPriceOnDropped()*0.1)/0.1;
}
int V=75;
if (p<Ask)
{
request.action =TRADE_ACTION_PENDING; // тип торговой операции
request.symbol =Symbol(); // символ
request.volume =MathFloor(AccountInfoDouble(ACCOUNT_BALANCE)/V/((Ask-p)/
SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE)*SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE)));
if (request.volume>AccountInfoDouble(ACCOUNT_BALANCE)/SymbolInfoDouble(_Symbol,SYMBOL_MARGIN_INITIAL))
{ request.volume=MathFloor(AccountInfoDouble(ACCOUNT_BALANCE)/SymbolInfoDouble(_Symbol,SYMBOL_MARGIN_INITIAL));
}
request.type =ORDER_TYPE_BUY_LIMIT; // тип ордера
request.price =NormalizeDouble(Ask-SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE),digits); // цена для открытия
request.deviation=50; // допустимое отклонение от цены
request.sl =p; // Stop Loss позиции
request.tp =NormalizeDouble(Ask+(Ask-p)*3,digits); // Take Profit позиции
request.type_filling=ORDER_FILLING_IOC;
request.type_time=ORDER_TIME_DAY;
request.stoplimit=Ask;
OrderSend(request,result);
}
if (p>Bid)
{
request.action =TRADE_ACTION_PENDING; // тип торговой операции
request.symbol =Symbol(); // символ
request.volume =MathFloor(AccountInfoDouble(ACCOUNT_BALANCE)/V/((p-Bid)/
SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE)*SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_VALUE)));
if (request.volume>AccountInfoDouble(ACCOUNT_BALANCE)/SymbolInfoDouble(_Symbol,SYMBOL_MARGIN_INITIAL))
{ request.volume=MathFloor(AccountInfoDouble(ACCOUNT_BALANCE)/SymbolInfoDouble(_Symbol,SYMBOL_MARGIN_INITIAL));
} // объем
request.type =ORDER_TYPE_SELL_LIMIT; // тип ордера
request.price =NormalizeDouble(Bid+SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE),digits); // цена для открытия
request.deviation=50; // допустимое отклонение от цены
request.sl =p; // Stop Loss позиции
request.tp =NormalizeDouble(Bid-(p-Bid)*3,digits); // Take Profit позиции
request.type_time=ORDER_TIME_DAY;
request.type_filling=ORDER_FILLING_IOC;
request.stoplimit=Bid;
OrderSend(request,result);
}
Alert(result.retcode);
return;
}
Ну вот как Вам помочь? Сначала Вы пишете, что не выставляется Sell Limit, приводите выдержки из лога. Теперь же речь идет уже об ордере Buy Limit. Выходит, что проблема какая-то плавающая. Кроме того, ни разу не привели стейтмента. Вы ведь утверждаете, что в реальности ордера не видно. А стейтмент может помочь в прояснении ситуации.
Не выставляется ни Sell Limit ни Buy Limit,Alert(result.retcode) возвращает 10009. Где взять этот "стейтмент", что нужно сделать?
Запустил этот код у себя. Заметьте, что на небиржевых символах будете получать ошибку деления на 0, т. к. инициализирующая маржа там отсутствует.
Там, где удалось запустить, пришлось добавить проверку объема. Иначе объем оказывался нулевым:
if (request.volume < SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN))
request.volume = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);
После этого ордер устанавливается успешно. Также заметьте, что срабатывает он достаточно быстро - близкое расположение к цене. Поэтому сам ордер Вы можете не успеть заметить. Он превращается в позицию или присоединяется к ней, если тип счета - неттинг.
Не выставляется ни Sell Limit ни Buy Limit,Alert(result.retcode) возвращает 10009. Где взять этот "стейтмент", что нужно сделать?
Вкладка "История" окна "Инструменты". В контекстном меню выберите "Ордера". Затем также из контекстного меню "Отчет" - "HTML". Но, наверное, сами сможете увидеть причину отсутствия ордера: его состояние будет помечено "filled".
Запустил этот код у себя. Заметьте, что на небиржевых символах будете получать ошибку деления на 0, т. к. инициализирующая маржа там отсутствует.
Там, где удалось запустить, пришлось добавить проверку объема. Иначе объем оказывался нулевым:
После этого ордер устанавливается успешно. Также заметьте, что срабатывает он достаточно быстро - близкое расположение к цене. Поэтому сам ордер Вы можете не успеть заметить. Он превращается в позицию или присоединяется к ней, если тип счета - неттинг.
В конце кода еще Alert(result.retcode);
в общем журнале:
2018.05.14 12:08:16.984 Scripts script ЛИМИТ (Si-6.18,M15) loaded successfully
2018.05.14 12:08:17.187 Trades '992940': buy limit 3.00 Si-6.18 at 62091 (62092) sl: 61821 tp: 62905
2018.05.14 12:08:17.484 Trades '992940': accepted buy limit 3.00 Si-6.18 at 62091 (62092) sl: 61821 tp: 62905
2018.05.14 12:08:17.500 Trades '992940': buy limit 3.00 Si-6.18 at 62091 (62092) sl: 61821 tp: 62905 placed for execution
2018.05.14 12:08:17.546 Trades '992940': order #13235300 buy limit 3.00 / 3.00 Si-6.18 at 62091 done in 337.532 ms
2018.05.14 12:08:17.578 Scripts script ЛИМИТ (Si-6.18,M15) removed
В графе Эксперты: 2018.05.14 12:08:17.578 ЛИМИТ (Si-6.18,M15) Alert: 10009, больше ничего нет
Ну вот как Вам помочь? Сначала Вы пишете, что не выставляется Sell Limit, приводите выдержки из лога. Теперь же речь идет уже об ордере Buy Limit. Выходит, что проблема какая-то плавающая. Кроме того, ни разу не привели стейтмента. Вы ведь утверждаете, что в реальности ордера не видно. А стейтмент может помочь в прояснении ситуации.
Ну вот как Вам помочь? Сначала Вы пишете, что не выставляется Sell Limit, приводите выдержки из лога. Теперь же речь идет уже об ордере Buy Limit. Выходит, что проблема какая-то плавающая. Кроме того, ни разу не привели стейтмента. Вы ведь утверждаете, что в реальности ордера не видно. А стейтмент может помочь в прояснении ситуации.
Не выставляется ни Sell Limit ни Buy Limit, Alert(result.retcode) возвращает 10009. Где взять этот "стейтмент", что нужно сделать?
Запустил этот код у себя. Заметьте, что на небиржевых символах будете получать ошибку деления на 0, т. к. инициализирующая маржа там отсутствует.
Там, где удалось запустить, пришлось добавить проверку объема. Иначе объем оказывался нулевым:
После этого ордер устанавливается успешно. Также заметьте, что срабатывает он достаточно быстро - близкое расположение к цене. Поэтому сам ордер Вы можете не успеть заметить. Он превращается в позицию или присоединяется к ней, если тип счета - неттинг.
Не выставляется ни Sell Limit ни Buy Limit, Alert(result.retcode) возвращает 10009. Где взять этот "стейтмент", что нужно сделать?
Вкладка "История" окна "Инструменты". В контекстном меню выберите "Ордера". Затем также из контекстного меню "Отчет" - "HTML". Но, наверное, сами сможете увидеть причину отсутствия ордера: его состояние будет помечено "filled".
Нашел скриптик у себя за 2009 год, а там сейчас компиляция с предупреждением:'M' - unrecognized character escape sequence 1.mq4 66 37
Подскажите, что там в строке подправить, что б корректно компилилось
Запустил этот код у себя. Заметьте, что на небиржевых символах будете получать ошибку деления на 0, т. к. инициализирующая маржа там отсутствует.
Там, где удалось запустить, пришлось добавить проверку объема. Иначе объем оказывался нулевым:
После этого ордер устанавливается успешно. Также заметьте, что срабатывает он достаточно быстро - близкое расположение к цене. Поэтому сам ордер Вы можете не успеть заметить. Он превращается в позицию или присоединяется к ней, если тип счета - неттинг.
Нашел скриптик у себя за 2009 год, а там сейчас компиляция с предупреждением:'M' - unrecognized character escape sequence 1.mq4 66 37
Подскажите, что там в строке подправить, что б корректно компилилось
Двойной обратный слеш поставьте перед MQL4