Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 550

 
iv1986:

Alla fine del codice anche Alert(result.retcode);

nel registro generale:

2018.05.14 12:08:16.984 Scripts script LIMIT (Si-6.18,M15) caricato con successo

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': accettato acquisto limite 3.00 Si-6.18 a 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 LIMIT (Si-6.18,M15) rimosso

Nella colonna degli esperti: 2018.05.14 12:08:17.578 LIMIT (Si-6.18,M15) Alert: 10009, niente altro

Beh, ecco come aiutarti? Per prima cosa, scrivete che Sell Limit non è esibito, date degli estratti dal registro. E ora stiamo parlando di un ordine Buy Limit. Quindi, il problema deve essere fluttuante. Inoltre, non avete mai citato la dichiarazione. Lei sostiene che l'ordine non è visibile nella realtà. E la dichiarazione può aiutare a chiarire la situazione.

 
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:

Come posso aiutarla? In primo luogo, scrivete che Sell Limit non viene piazzato, e date degli estratti dal registro. Ora stiamo parlando di un ordine Buy Limit. Quindi, il problema deve essere fluttuante. Inoltre, non avete mai citato la dichiarazione. Lei sostiene che l'ordine non è visibile nella realtà. La dichiarazione può aiutare a chiarire la situazione.

Né Sell Limit né Buy Limit sono impostati, Alert(result.retcode) restituisce 10009. Dove posso ottenere questa "dichiarazione", cosa devo fare?

 
iv1986:

Eseguire questo codice da solo. Notate che otterrete un errore di divisione di 0 sui simboli non binari, poiché non c'è margine di inizializzazione.

Nel codice in cui sono riuscito a farlo funzionare, ho dovuto aggiungere un controllo del volume. Altrimenti, il volume era uguale a zero:

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

Dopo di che, l'ordine è impostato con successo. Notate anche che si innesca abbastanza rapidamente - è vicino al prezzo. Pertanto, l'ordine stesso potrebbe non essere notato da voi. L'ordine diventerà una posizione o sarà collegato ad essa se il tipo di conto è netting.

 
iv1986:

Né Sell Limit né Buy Limit sono impostati, Alert(result.retcode) restituisce 10009. Dove posso trovare questo "retcode", cosa devo fare?

La scheda "Storia" della finestra "Toolbox". Nel menu di contesto selezionate "Ordini". Poi seleziona "Report" dal menu contestuale - "HTML". Ma probabilmente sarete in grado di vedere da soli perché l'ordine manca: il suo stato sarà segnato come "riempito".

 

Ho trovato il mio script del 2009, ma ora compila con un avvertimento:'M' - sequenza di caratteri non riconosciuta 1.mq4 66 37

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

Puoi dirmi cosa modificare nella linea per compilare correttamente?

 
Ihor Herasko:

Eseguire questo codice da solo. Notate che otterrete un errore di divisione di 0 sui simboli non binari, poiché non c'è margine di inizializzazione.

Nel codice in cui sono riuscito a farlo funzionare, ho dovuto aggiungere un controllo del volume. Altrimenti, il volume era uguale a zero:

Dopo di che, l'ordine è impostato con successo. Notate anche che si innesca abbastanza rapidamente - è vicino al prezzo. Pertanto, l'ordine stesso potrebbe non essere notato da voi. L'ordine diventerà una posizione o sarà collegato ad essa se il tipo di conto è netting.

Grazie!
 
HeAic:

Ho trovato il mio script del 2009, ma ora compila con un avvertimento:'M' - sequenza di caratteri non riconosciuta 1.mq4 66 37

Puoi dirmi cosa modificare nella linea per compilare correttamente?

Mettere un doppio backslash prima di MQL4
 
Ciao, puoi dirmi se è possibile collegare un segnale di copia e un robot a un conto mt4 e collegare tutto questo al vps?
 
Artyom Trishkin:
Mettere un doppio backslash davanti a MQL4
e anche prima di F. Tutti gli slash dovrebbero essere doppi slash