Любые вопросы новичков по MQL4 и MQL5, помощь и обсуждение по алгоритмам и кодам - страница 550

 
iv1986:

В конце кода еще  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. Выходит, что проблема какая-то плавающая. Кроме того, ни разу не привели стейтмента. Вы ведь утверждаете, что в реальности ордера не видно. А стейтмент может помочь в прояснении ситуации.

 
void OnStart()
 {MqlTradeRequest request={0};
  MqlTradeResult  result={0};
 double Bid=SymbolInfoDouble(Symbol(),SYMBOL_BID);
 double Ask=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;
   }
 
Ihor Herasko:

Ну вот как Вам помочь? Сначала Вы пишете, что не выставляется Sell Limit, приводите выдержки из лога. Теперь же речь идет уже об ордере Buy Limit. Выходит, что проблема какая-то плавающая. Кроме того, ни разу не привели стейтмента. Вы ведь утверждаете, что в реальности ордера не видно. А стейтмент может помочь в прояснении ситуации.

 Не выставляется ни Sell Limit ни Buy Limit, Alert(result.retcode) возвращает 10009. Где взять этот "стейтмент", что нужно сделать?  

 
iv1986:

Запустил этот код у себя. Заметьте, что на небиржевых символах будете получать ошибку деления на 0, т. к. инициализирующая маржа там отсутствует.

Там, где удалось запустить, пришлось добавить проверку объема. Иначе объем оказывался нулевым:

if (request.volume < SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN))
   request.volume = SymbolInfoDouble(_Symbol, SYMBOL_VOLUME_MIN);

После этого ордер устанавливается успешно. Также заметьте, что срабатывает он достаточно быстро - близкое расположение к цене. Поэтому сам ордер Вы можете не успеть заметить. Он превращается в позицию или присоединяется к ней, если тип счета - неттинг.

 
iv1986:

 Не выставляется ни Sell Limit ни Buy Limit, Alert(result.retcode) возвращает 10009. Где взять этот "стейтмент", что нужно сделать?  

Вкладка "История" окна "Инструменты". В контекстном меню выберите "Ордера". Затем также из контекстного меню "Отчет" - "HTML". Но, наверное, сами сможете увидеть причину отсутствия ордера: его состояние будет помечено "filled".

 

Нашел скриптик у себя за 2009 год, а там сейчас компиляция с предупреждением:'M' - unrecognized character escape sequence  1.mq4    66    37

PapkaFiles    = TerminalPath()+"\MQL4\Files\\";//Путь к терминалу 

Подскажите, что там в строке подправить, что б корректно компилилось

 
Ihor Herasko:

Запустил этот код у себя. Заметьте, что на небиржевых символах будете получать ошибку деления на 0, т. к. инициализирующая маржа там отсутствует.

Там, где удалось запустить, пришлось добавить проверку объема. Иначе объем оказывался нулевым:

После этого ордер устанавливается успешно. Также заметьте, что срабатывает он достаточно быстро - близкое расположение к цене. Поэтому сам ордер Вы можете не успеть заметить. Он превращается в позицию или присоединяется к ней, если тип счета - неттинг.

Спасибо!
 
HeAic:

Нашел скриптик у себя за 2009 год, а там сейчас компиляция с предупреждением:'M' - unrecognized character escape sequence  1.mq4    66    37

Подскажите, что там в строке подправить, что б корректно компилилось

Двойной обратный слеш поставьте перед MQL4
 
Здравствуйте, а скажите можно в мт4 подключить на счет сигнал для копирования и робота и подключить все это дело к vps?
 
Artyom Trishkin:
Двойной обратный слеш поставьте перед MQL4
и перед F тоже. Все слеши должны быть двойные
Причина обращения: