Domande dai principianti MQL5 MT5 MetaTrader 5 - pagina 799

 
Aleksey Vyazmikin:

Grazie! Ho cercato e non l'ho trovato...

Poi la prossima domanda, diciamo che il passo è 25, allora come organizzare l'arrotondamento a un numero divisibile per 25, forse c'è una funzione?

https://www.mql5.com/ru/docs/standardlibrary/tradeclasses/csymbolinfo/csymbolinfonormalizeprice

Документация по MQL5: Стандартная библиотека / Торговые классы / CSymbolInfo / NormalizePrice
Документация по MQL5: Стандартная библиотека / Торговые классы / CSymbolInfo / NormalizePrice
  • www.mql5.com
Стандартная библиотека / Торговые классы / CSymbolInfo / NormalizePrice - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 

Grazie, ma non sto usando la libreria commerciale standard.

 
Vladislav Andruschenko:
Nessun codice, nessun commento.

Sì, è strano. Ho allegato il file, ma non l'ho controllato. Colpa mia. Ora sto allegando sia il codice che l'estratto di codice dove il tester dà una linea con [Invalid stops]. Voglio capire come funziona la struttura di MqlTradeRequest quando si modifica la posizione. Nel mio caso è quando si cambia la fermata del SAR. Non riesco a sbarazzarmi del messaggio [Invalid stops] del tester. Strumento di giunzione RTS.

//+------------------------------------------------------------------+
//| Модификация Stop Loss открытой позиции                           |
//+------------------------------------------------------------------+
//--- объявление запроса и результата
   MqlTradeRequest request;
   MqlTradeResult  result;

   int total=PositionsTotal(); // количество открытых позиций  
   Print("total = ",total," ");
//--- перебор всех открытых позиций
   for(int i=0; i<total; i++)
     {
      if(PositionSelect(_Symbol)==true) // есть открытая позиция
        {
         //--- параметры ордера
         ulong  position_ticket=PositionGetTicket(i);// тикет позиции
         string position_symbol=PositionGetString(POSITION_SYMBOL); // символ 
         int    digits=(int)SymbolInfoInteger(position_symbol,SYMBOL_DIGITS); // количество знаков после запятой
         ulong  magic=PositionGetInteger(POSITION_MAGIC); // MagicNumber позиции

         if(PositionSelect(position_symbol)) // если позицию удалось выделить, значит - позиция существует
           {
            //--- обнуление значений запроса и результата
            ZeroMemory(request);
            ZeroMemory(result);
            //--- установка параметров операции
            request.action = TRADE_ACTION_SLTP;   // тип торговой операции
            request.position = position_ticket;   // тикет позиции
            request.symbol = position_symbol;     // символ 
            request.sl= STP;                      // Stop Loss позиции
            request.tp = 0;                       // Take Profit позиции

            //--- отсылаем ордер
            int number=OrderSend(request,result);
            // анализируем код возврата торгового сервера
            if(result.retcode==10009 || result.retcode==10008) //Request is completed or order placed
              {
               Alert("Ордер Sell успешно помещен, тикет ордера # ",result.order," ");
              }
            else
              {
               Alert("Запрос на установку ордера Sell не выполнен - код ошибки:",GetLastError());
               return;
              }
           }
        }
     }
File:
SAR_SAR.mq5  27 kb
 
DCodec:

Sì, è strano. Ho allegato il file, ma non l'ho controllato. Colpa mia. Ora sto allegando sia il codice che un estratto di codice dove il tester dà una linea con [Invalid stops]. Voglio capire come funziona la struttura di MqlTradeRequest quando si modifica la posizione. Nel mio caso è quando si cambia la fermata del SAR. Non riesco a sbarazzarmi del messaggio [Invalid stops] del tester. Strumento di giunzione RTS.

Questo non è quel frammento di codice dove dovremmo cercare un errore, a prima vista. È solo la tripla selezione di una stessa posizione che mi preoccupa. È ridondante.

Hai un errore nelle fermate errate, dovresti probabilmente iniziare la tua ricerca dal luogo in cui queste fermate sono calcolate.

 
DCodec:

Sì, è strano. Ho allegato il file, ma non l'ho controllato. Colpa mia. Ora sto allegando sia il codice che un estratto di codice dove il tester dà una linea con [Invalid stops]. Voglio capire come funziona la struttura di MqlTradeRequest quando si modifica la posizione. Nel mio caso è quando si cambia la fermata del SAR. Non riesco a sbarazzarmi del messaggio [Invalid stops] del tester. Giunzione RTS.

Per una piena comprensione è necessario specificare che tipo di account hadge o netting

Se il tipo di conto è statoge

if(PositionSelect(_Symbol)==true) // есть открытая позиция

Avete scelto una posizione per il simbolo, ma potrebbe non essere esattamente quello che volevate vedere...

ulong  position_ticket=PositionGetTicket(i);// тикет позиции

Ma ora abbiamo scelto la posizione esatta che volevamo.

La funzione restituisce un biglietto di una posizione per indice nella lista delle posizioni aperte e seleziona automaticamente questa posizione per lavorare ulteriormente con essa usando


Poi, prova di nuovo a scegliere la posizione giusta

if(PositionSelect(position_symbol)) // если позицию удалось выделить, значит - позиция существует

Di nuovo, la probabilità di aver scelto la posizione sbagliata è molto alta

Quando si rappresentano le posizioni in modo indipendente (ACCOUNT_MARGIN_MODE_RETAIL_HEDGING), diverse posizioni possono essere aperte simultaneamente per ogni simbolo. In questo caso, PositionSelect selezionerà la posizione con il tick più piccolo.


Per controllare come si comporta la funzione OrderSend() in questo caso, dovreste farlo, ma è meglio farlo come dovrebbe essere e se l'errore non scompare, stampare non solo il codice di errore, ma anche il ticket di posizione, il prezzo della posizione, il prezzo del nuovo stop e take. Questo è il minimo.

 
Alexey Viktorov:

Per una piena comprensione è necessario specificare che tipo di account hadge o netting

Grazie per i vostri commenti. Il tipo di conto è il netting. Giunzione RTS. È questa la parte difficile? Una posizione su un simbolo. Puoi scegliere come vuoi, arriverai comunque a quella posizione. Questi non sono ordini pendenti, vero? Ecco perché non capisco ancora di più - cosa c'è che non va? Ho provato tutte le varianti.

 
DCodec:

Grazie per i commenti. Netting del tipo di conto. Strumento di giunzione RTS. È questa la parte difficile? Una posizione su un simbolo. Puoi scegliere come vuoi, arriverai comunque a quella posizione. Questi non sono ordini pendenti, vero? Ecco perché non capisco ancora di più - cosa c'è che non va? Ho provato tutte le varianti.

Non c'è una risposta a questo?

Forum sul trading, sistemi di trading automatico e test di strategia

Domande dai principianti MQL5 MT5 MetaTrader 5

Alexey Viktorov, 2017.11.22 09:29

Per controllare come si comporta la funzione OrderSend() in questo caso, è necessario farlo e controllare, ma è meglio fare come dovrebbe e se l'errore non è andato stampare non solo il codice di errore, ma anche il biglietto di posizione, prezzo di posizione, prezzo del nuovo stop e prendere. Questo è il minimo.


 
DCodec:

Ecco perché non capisco ancora di più - COSA c'è che non va? Ho provato tutte le opzioni.

Inserisci questa linea dove si verifica l'errore

Print(ToString(request) + ToString(result));

Forum sul trading, sistemi di trading automatico e test di strategie di trading

Peculiarità del linguaggio mql5, sottigliezze e trucchi

fxsaber, 2017.02.25 16:27

Tradurre le strutture MqlTrade in una stringa
#define TOSTRING(A)  #A + " = " + (string)(A) + "\n"
#define TOSTRING2(A) #A + " = " + EnumToString(A) + " (" + (string)(A) + ")\n"

string ToString( const MqlTradeTransaction &Trans )
{
  return(TOSTRING(Trans.deal) + TOSTRING(Trans.order) + TOSTRING(Trans.symbol) +
         TOSTRING2(Trans.type) + TOSTRING2(Trans.order_type) + TOSTRING2(Trans.order_state) +
         TOSTRING2(Trans.deal_type) + TOSTRING2(Trans.time_type) +
         TOSTRING(Trans.time_expiration) + TOSTRING(Trans.price) + TOSTRING(Trans.price_trigger) +
         TOSTRING(Trans.price_sl) + TOSTRING(Trans.price_tp) + TOSTRING(Trans.volume) +
         TOSTRING(Trans.position) + TOSTRING(Trans.position_by));
}

string ToString( const MqlTradeRequest &Request )
{
  return(TOSTRING2(Request.action) + TOSTRING(Request.magic) + TOSTRING(Request.order) +
         TOSTRING(Request.symbol) + TOSTRING(Request.volume) + TOSTRING(Request.price) +
         TOSTRING(Request.stoplimit) + TOSTRING(Request.sl) +  TOSTRING(Request.tp) +
         TOSTRING(Request.deviation) + TOSTRING2(Request.type) + TOSTRING2(Request.type_filling) +
         TOSTRING2(Request.type_time) + TOSTRING(Request.expiration) + TOSTRING(Request.comment) +
         TOSTRING(Request.position) + TOSTRING(Request.position_by));
}

string ToString( const MqlTradeResult &Result )
{
  return(TOSTRING(Result.retcode) + TOSTRING(Result.deal) + TOSTRING(Result.order) +
         TOSTRING(Result.volume) + TOSTRING(Result.price) + TOSTRING(Result.bid) +  
         TOSTRING(Result.ask) + TOSTRING(Result.comment) + TOSTRING(Result.request_id) +  
         TOSTRING(Result.retcode_external));
}

#undef TOSTRING
#undef TOSTRING2

 
fxsaber:

Inserisci questa linea dove si verifica l'errore


Incollato. Ecco il risultato del tester:

2017.11.22 18:22:51.127 2016.11.09 12:00:00 exchange buy 1.00 RTS Splice at 98080 sl: 94130 (98070 / 98080 / 98070)
2017.11.22 18:22:51.127 2016.11.09 12:00:00 deal #4 buy 1.00 RTS Splice at 98080 done (based on order #4)
2017.11.22 18:22:51.127 2016.11.09 12:00:00 deal performed [#4 buy 1.00 RTS Splice at 98080]
2017.11.22 18:22:51.127 2016.11.09 12:00:00 ordine eseguito comprare 1,00 a 98080 [#4 comprare 1,00 RTS Splice a 98080]
2017.11.22 18:22:53.561 2016.11.09 14:05:00:00 failed modify #4 buy 1.00 RTS Splice sl: 94130, tp: 0 -> sl: 94316, tp: 0 [Stop non valido]
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.action = TRADE_ACTION_SLTP (6)
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.magic = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.order = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.symbol = RTS Splice
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.volume = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.price = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.stoplimit = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Richiesta.sl = 94316.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.tp = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.deviation = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.type = ORDER_TYPE_BUY (0)
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.type_filling = ORDER_FILLING_FOK (0)
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.type_time = ORDER_TIME_GTC (0)
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.expiration = 1970.01.01 00:00:00
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.comment =
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.position = 4
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Request.position_by = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Risultato.retcode = 10016
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Risultato.deal = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Risultato.ordine = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Risultato.volume = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Risultato.prezzo = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Risultato.offerta = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Risultato.ask = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Result.comment = Invalid stops
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Result.request_id = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Risultato.retcode_external = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Allarme: errore di modifica della posizione da parte di TP e codice errore SL: 4756

 
DCodec:

Mettilo dentro. Ecco il risultato del tester:

Modalità server e tester?