Perguntas de Iniciantes MQL5 MT5 MetaTrader 5 - página 799

 
Aleksey Vyazmikin:

Obrigado! Procurei e não consegui encontrá-lo...

Então a questão seguinte, digamos que o passo é 25, então como organizar arredondamentos para um número divisível por 25, talvez haja uma função?

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

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

Obrigado, mas não estou a utilizar a biblioteca comercial padrão.

 
Vladislav Andruschenko:
Sem código, sem comentários.

Sim, isso é esquisito. Anexou o ficheiro, mas não o verificou. Erro meu. Agora estou a anexar tanto o código como o excerto de código onde o testador dá uma linha com [Paragens inválidas]. Quero compreender como funciona a estrutura MqlTradeRequest quando se modifica a posição. No meu caso é quando se muda de paragem na SAR. Não me consigo livrar da mensagem [Paragens inválidas] do testador. Ferramenta RTS Splice.

//+------------------------------------------------------------------+
//| Модификация 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;
              }
           }
        }
     }
Arquivos anexados:
SAR_SAR.mq5  27 kb
 
DCodec:

Sim, isso é esquisito. Anexou o ficheiro, mas não o verificou. Erro meu. Agora estou a anexar tanto o código como um excerto de código onde o testador dá uma linha com [Paragens inválidas]. Quero compreender como funciona a estrutura MqlTradeRequest quando se modifica a posição. No meu caso é quando se muda de paragem na SAR. Não me consigo livrar da mensagem [Paragens inválidas] do testador. Ferramenta RTS Splice.

Este não é aquele fragmento de código onde devemos procurar um erro, à primeira vista. É apenas a tripla selecção de uma e a mesma posição que me incomoda. É redundante.

Se tiver um erro em paragens incorrectas, deve provavelmente iniciar a sua pesquisa a partir do local onde estas paragens são calculadas.

 
DCodec:

Sim, isso é esquisito. Anexou o ficheiro, mas não o verificou. Erro meu. Agora estou a anexar tanto o código como o excerto de código onde o testador dá uma linha com [Paragens inválidas]. Quero compreender como funciona a estrutura MqlTradeRequest quando se modifica a posição. No meu caso é quando se muda de paragem na SAR. Não me consigo livrar da mensagem [Paragens inválidas] do testador. RTS Splice.

Para uma compreensão completa, é necessário especificar que tipo de conta teve ou netting

Se o tipo de conta foi falsificada

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

Escolheu uma posição para o símbolo, mas pode não ser exactamente o que queria ver...

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

Mas agora escolhemos a posição exacta que queríamos.

A função devolve um ticket de uma posição por índice na lista de posições abertas e selecciona automaticamente esta posição para continuar a trabalhar com ela utilizando


A seguir, tente novamente escolher a posição certa

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

Mais uma vez, a probabilidade de ter escolhido a posição errada é muito elevada

Ao representar posições de forma independente (ACCOUNT_MARGIN_MODE_RETAIL_HEDGING), várias posições podem ser abertas para cada símbolo simultaneamente. Neste caso, PositionSelect seleccionará a posição com o menor tick.


Para verificar como funciona a função OrderSend() neste caso, deve fazê-lo, mas é melhor fazê-lo como deve ser e se o erro não desaparecer, imprimir não só o código de erro, mas também o bilhete de posição, o preço da posição, o preço da nova paragem e tomada. Isto é o mínimo.

 
Alexey Viktorov:

Para uma compreensão completa, é necessário especificar que tipo de conta tem ou netting

Obrigado pelos vossos comentários. O tipo de conta é netting. RTS Splice. Será essa a parte complicada? Uma posição sobre um símbolo. Pode escolher a forma que quiser, ainda assim chegará a essa posição. Estas não são ordens pendentes, pois não? É por isso que não compreendo ainda mais - o que é que se passa? Experimentei todas as variantes.

 
DCodec:

Obrigado pelos comentários. Compensação do tipo de conta. Instrumento RTS Splice. Será essa a parte complicada? Uma posição sobre um símbolo. Pode escolher a forma que quiser, ainda assim chegará a essa posição. Estas não são ordens pendentes, pois não? É por isso que não compreendo ainda mais - o que é que se passa? Experimentei todas as variantes.

Não há resposta a isto?

Fórum sobre Comércio, Sistemas de Comércio Automatizados e Testes de Estratégia

Perguntas de Iniciantes MQL5 MT5 MetaTrader 5

Alexey Viktorov, 2017.11.22 09:29

Para verificar como funciona a função OrderSend() neste caso, é necessário fazê-lo e verificar, mas é melhor fazer como deve ser e se o erro não desaparecer imprimir não só o código de erro mas também o bilhete de posição, o preço da posição, o preço da nova paragem e tomada. Isto é o mínimo.


 
DCodec:

É por isso que não compreendo ainda mais - O QUE É ERRADO?? Experimentei todas as opções.

Insira esta linha onde o erro ocorre

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

Fórum sobre comércio, sistemas automatizados de comércio e teste de estratégias comerciais

Peculiaridades da linguagem mql5, subtilezas e truques

fxsaber, 2017.02.25 16:27

Traduzir as estruturas MqlTrade- numa corda
#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:

Insira esta linha onde o erro ocorre


Colado. Aqui está o resultado do testador:

2017.11.22 18:22:51.127 2016.11.09 12:00:00 troca comprar 1,00 RTS Splice a 98080 sl: 94130 (98070 / 98080 / 98070)
2017.11.22 18:22:51.127 2016.11.09 12:00:00 negócio #4 comprar 1,00 RTS Splice a 98080 feito (com base na encomenda #4)
2017.11.22 18:22:51.127 2016.11.09 12:00:00 negócio realizado [#4 comprar 1,00 RTS Splice a 98080]
2017.11.22 18:22:51.127 2016.11.09 12:00:00 encomenda realizada comprar 1,00 a 98080 [#4 comprar 1,00 RTS Splice a 98080]
2017.11.22 18:22:53.561 2016.11.09 14:05:00:00 não conseguiu modificar #4 comprar 1,00 RTS Splice sl: 94130, tp: 0 -> sl: 94316, tp: 0 [Paragens inválidas]
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 Pedido.encomenda = 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 Pedido.volume = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Pedido.preço = 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 Request.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.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 Resultado.retcode = 10016
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Resultado.deal = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Resultado.encomenda = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Resultado.volume = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Resultado.preço = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Resultado.licitação = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Resultado.pergunte = 0.0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Resultado.comentário = Paragens inválidas
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Resultado.request_id = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Resultado.retcode_external = 0
2017.11.22 18:22:53.576 2016.11.09 14:05:00 Alerta: Erro de modificação de posição por TP e código de erro SL: 4756

 
DCodec:

Coloque-o. Aqui está o resultado do testador:

Modo servidor e modo testador?