Bibliotecas: MT4Orders - página 55

 
fxsaber:

O MT4Orders é do estilo do MT4 no MT5. Portanto, o comportamento do OrderSend é o mesmo de sua contraparte do MT4.

Sim, essa parte funciona e o tíquete da ordem pendente vai para o tíquete da posição e tudo é modificado, mas não funciona o tempo todo. Ao fechar uma posição, aparece uma negociação nas ordens SL ou TP e a verificação no tíquete para o momento de fechar uma ordem a mercado não funciona.

Quebrei minha cabeça. Fechamento por SL. No testador, se o tíquete da ordem for 3, ele coincide com o tíquete da transação e o último seletor está normal. Se for 2, o erro de seleção é 4754. No real/demo sempre não coincide.

Лог
2020.10.22 16:46:14.665 Trades  '25610628': accepted modify #745859775 sell 1 EURUSD sl: 1.18258, tp: 1.18197 -> sl: 1.18254, tp: 1.18194
2020.10.22 16:46:14.672 Trades  '25610628': modify #745859775 sell 1 EURUSD -> sl: 1.18254, tp: 1.18194 done in 129.694 ms
2020.10.22 16:48:06.783 Trades  '25610628': deal #725926213 buy 1 EURUSD at 1.18254 done (based on order #745887632)

// verificar o fechamento da posição
if(OrderSelect(Tickets, SELECT_BY_TICKET)==true) // Ao fechar pelo SL e retornar o erro 4754.
        {
         if(OrderCloseTime()==0)              //O quesubstituir, como saber que a posição não está no histórico
           {
            ModifyTral();
            return;
           }
         if(OrderCloseTime()!=0)              // E, em seguida, substitua-o para perceber que a posição foi para o histórico
           {
            End=true;
            Alert("Nossa ordem de mercado foi encerrada. O trabalho do Consultor está concluído.",
                  " Swap = ", OrderSwap(), " Comissão = ", OrderCommission()); // эта часть работает в тестере)))
            return;
           }
        }

Тикет ордера позиции не 3
LO      0       19:16:54.104    Time_Open_Trail_2_21 (EURUSD,M5)        2018.07.02 00:10:17   Alert: Проверяем закрытие Позиции и Модифицируем если нужно Tickets 2 Or 0
ON      0       19:16:54.104    Trade   2018.07.02 00:10:19   stop loss triggered #2  buy 1 EURUSD 1.16771 sl: 1.16719 tp: 1.17241 [#4  sell 1 EURUSD at 1.16719]
LQ      0       19:16:54.104    Trades  2018.07.02 00:10:19   deal #3  sell 1 EURUSD at 1.16719 done (based on order #4)
 HN      0       19:16:54.104    Trade   2018.07.02 00:10:19   deal performed [#3  sell 1 EURUSD at 1.16719]
RI      0       19:16:54.104    Trade   2018.07.02 00:10:19   order performed sell 1 at 1.16719 [#4  sell 1 EURUSD at 1.16719]
FJ      0       19:16:54.104    Time_Open_Trail_2_21 (EURUSD,M5)        2018.07.02 00:10:19   Alert: Проверяем закрытие Позиции и Модифицируем если нужно Tickets 2 Or 0
FI      0       19:16:54.104    Time_Open_Trail_2_21 (EURUSD,M5)        2018.07.02 00:10:19   Alert: OrderSelect() нашего рыночного ордера вернул ошибку - 4754
IQ      0       19:16:54.104    Time_Open_Trail_2_21 (EURUSD,M5)        2018.07.02 00:10:19   Alert: Или Наш рыночный ордер закрылся. время закрытия 1970.01.01 00:00:00 Tickets 2 Своп = 0.0 Комиссия = 0.0
KN      0       19:16:54.104    Time_Open_Trail_2_21 (EURUSD,M5)        2018.07.02 00:10:21   Alert: Работа эксперта завершена. Прибыль/убыток = 0.0



Тикет ордера-позиции 3
PF      0       19:21:30.198    Time_Open_Trail_2_21 (EURUSD,M5)        2018.07.02 00:44:36   Alert: Проверяем закрытие Позиции и Модифицируем если нужно Tickets 3 Or 1
KH      0       19:21:30.198    Trade   2018.07.02 00:44:37   stop loss triggered #3  sell 1 EURUSD 1.16740 sl: 1.16800 tp: 1.16277 [#4  buy 1 EURUSD at 1.16800]
DN      0       19:21:30.198    Trades  2018.07.02 00:44:37   deal #3  buy 1 EURUSD at 1.16802 done (based on order #4)
 LJ      0       19:21:30.198    Trade   2018.07.02 00:44:37   deal performed [#3  buy 1 EURUSD at 1.16802]
EF      0       19:21:30.198    Trade   2018.07.02 00:44:37   order performed buy 1 at 1.16802 [#4  buy 1 EURUSD at 1.16800]
CL      0       19:21:30.198    Time_Open_Trail_2_21 (EURUSD,M5)        2018.07.02 00:44:37   Alert: Проверяем закрытие Позиции и Модифицируем если нужно Tickets 3 Or 1
QJ      0       19:21:30.198    Time_Open_Trail_2_21 (EURUSD,M5)        2018.07.02 00:44:37   Alert: Наш рыночный ордер закрылся. время закрытия 2018.07.02 00:44:37 Tickets 3 Своп = 0.0 Комиссия = 0.0
NE      0       19:21:30.198    Time_Open_Trail_2_21 (EURUSD,M5)        2018.07.02 00:44:37   Alert: Работа эксперта завершена. Прибыль/убыток = -62.0

/Solução estúpida, é claro.

if(OrderSelect(Tickets, SELECT_BY_TICKET)==true)
        {
         if(OrderCloseTime()==0)              // Se nossa ordem a mercado não estiver fechada
           {
            ModifyTral();
            return;
           }
         if(OrderCloseTime()!=0)              // Se nossa ordem a mercado tiver sido fechada
           {
            End=true;
            Alert("Nossa ordem de mercado foi encerrada. horário de encerramento".,OrderCloseTime(),"Tickets ",Tickets,
                  " Swap = ", OrderSwap(), " Comissão = ", OrderCommission());
            return;
           }
        }
      else
      {
            
         Alert("OrderSelect() de nossa ordem de mercado retornou um erro - ",GetLastError());
         
         End=true;
            Alert("Ou Nossa ordem de mercado foi fechada. horário de fechamento".,OrderCloseTime(),"Tickets ",Tickets,
                  " Swap = ", OrderSwap(), " Comissão = ", OrderCommission());
            return;
     }
 
Valeriy Yastremskiy:

Sim, essa parte funciona, e o tíquete da ordem pendente vai para o tíquete da posição e tudo é modificado, mas não funciona imediatamente. Ao fechar uma posição, aparece uma transação nas ordens SL ou TP e a verificação no tíquete para o tempo de fechamento de uma ordem a mercado não funciona.

Quebrei minha cabeça. Fechamento por SL. No testador, se o tíquete da ordem for 3, ele coincide com o tíquete da transação e o último seletor é normal. Se for 2, o erro de seleção é 4754. No real/demo sempre não coincide.

Forneça-me o arquivo mq5 que você acha que não está funcionando. Você está desperdiçando muitas informações. Isso não ajuda a entender o que você quer dizer. Melhor a fonte.

 
fxsaber:

Dê-me o arquivo mq5 que você acha que não está funcionando. Você está desperdiçando muitas informações. Isso não ajuda a entender o que você quer dizer. Melhor a fonte.

O código está uma bagunça, peço desculpas.

Arquivos anexados:
 
Valeriy Yastremskiy:

O código está uma bagunça, peço desculpas.

Da próxima vez, será melhor quanto aos méritos.

#include <MT4Orders.mqh> // https://www.mql5.com/pt/code/16006

#define  Ask SymbolInfoDouble(_Symbol, SYMBOL_ASK)

void OnTick()
{
  static TICKET_TYPE Ticket = -1;
  
  if (Ticket == -1)
    Ticket = OrderSend(_Symbol, OP_BUY, 1, Ask, 0, Ask - 100 * _Point, 0);
  else if (!OrdersTotal())
  {
    Print(OrderSelect(Ticket, SELECT_BY_TICKET)); // verdadeiro
    OrderPrint();
    
    Print(__MT4ORDERS__);
    
    ExpertRemove();
  }
}


Resultado.

2020.10.22 22:16:20.196 2020.10.21 00:03:10   market buy 1 EURAUD sl: 1.67661 (1.67664 / 1.67761)
2020.10.22 22:16:20.196 2020.10.21 00:03:10   deal #2  buy 1 EURAUD at 1.67761 done (based on order #2)
2020.10.22 22:16:20.196 2020.10.21 00:03:10   deal performed [#2  buy 1 EURAUD at 1.67761]
2020.10.22 22:16:20.196 2020.10.21 00:03:10   order performed buy 1 at 1.67761 [#2  buy 1 EURAUD at 1.67761]
2020.10.22 22:16:20.198 2020.10.21 00:12:59   stop loss triggered #2  buy 1 EURAUD 1.67761 sl: 1.67661 [#3  sell 1 EURAUD at 1.67661]
2020.10.22 22:16:20.198 2020.10.21 00:12:59   deal #3  sell 1 EURAUD at 1.67638 done (based on order #3)
2020.10.22 22:16:20.198 2020.10.21 00:12:59   deal performed [#3  sell 1 EURAUD at 1.67638]
2020.10.22 22:16:20.198 2020.10.21 00:12:59   order performed sell 1 at 1.67638 [#3  sell 1 EURAUD at 1.67661]
2020.10.22 22:16:20.198 2020.10.21 00:12:59   true
2020.10.22 22:16:20.198 2020.10.21 00:12:59   #3 2020.10.21 00:03:10.025 buy 1.00 EURAUD 1.67761 1.67661 0.00000 2020.10.21 00:12:59.874 1.67638 0.00 0.00 -123.00 sl 1.67661 0
2020.10.22 22:16:20.198 2020.10.21 00:12:59   2020.10.21
2020.10.22 22:16:20.198 2020.10.21 00:12:59   ExpertRemove() function called
 
fxsaber:

Da próxima vez, será melhor quanto aos méritos.


Resultado.

Obrigado.

 
fxsaber:

Da próxima vez, será melhor quanto aos méritos.

Resultado.

Encontrei o motivo, a versão antiga do MT4Orders 2018. Com ele e seu exemplo deu falso mudou para o mais recente tudo funcionou, e meu código também)

Muito obrigado.

 
Valeriy Yastremskiy:

Encontrei o motivo, a versão antiga do MT4Orders 2018.

Infelizmente, não descobri como fazer com que os usuários tropecem menos ao usar versões não atualizadas da biblioteca.

 

Se alguém invadir, ao usar essa biblioteca no MT5 na RannForex com a configuração "Send limit orders to the market at a price worse than the current one by N points" (Enviar ordens de limite ao mercado a um preço pior do que o atual em N pontos) ao modificar uma ordem de limite, o alt voará para este lugar

          WHILE((EqualSL && EqualTP && EqualPrice));

          if (!Res)
            ::Print("Line = " + (string)__LINE__ + "\n" + TOSTR(::OrderGetDouble(ORDER_SL)) + TOSTR(Request.sl)+
                    TOSTR(::OrderGetDouble(ORDER_TP)) + TOSTR(Request.tp) +
                    TOSTR(::OrderGetDouble(ORDER_PRICE_OPEN)) + TOSTR(Request.price) +
                    TOSTR(EqualSL) + TOSTR(EqualTP) + TOSTR(EqualPrice) +
                    TOSTR(::OrderSelect(Result.order)) +
                    TOSTR2((ENUM_ORDER_STATE)::OrderGetInteger(ORDER_STATE)));

Isso se deve ao fato de que o MT4Orders vê a ordem perdida marcada a favor, mas o corretor corrige imediatamente o preço de volta e, ao solicitar os parâmetros da ordem, o preço já é diferente. Portanto, parece ser um recurso.

 
traveller00:

Se alguém invadir, ao usar essa biblioteca no MT5 da RannForex com a configuração "Send limit orders to the market at a price worse than the current one by N pips" (Enviar ordens de limite para o mercado a um preço pior do que o atual por N pips), ao modificar o limitador, o alt voará para este local

Isso se deve ao fato de que o MT4Orders vê a ordem perdida marcada a favor, mas o corretor corrige imediatamente o preço de volta e, ao solicitar os parâmetros da ordem, o preço já é diferente. Portanto, parece ser um recurso.

Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação.

Bibliotecas: MT4Orders

fxsaber, 2020.09.29 08:45 AM

Com essa linha

MT4ORDERS::OrderSend_MaxPause = 0; // Desativar a validação do MT5-OrderSend.

você pode desativar tudo isso. Pode ser útil se o histórico de negociação do MT5 estiver ficando lento, porque o MT4Orders verifica a exatidão (e até corrige) do MT5-OrderSend às vezes acessando esse histórico.

Não recomendo isso.

Eu uso esse recurso.
 

Tenho um EA MT4 que estou tentando portar para o MT5 usando o MT4Orders para que eu possa manter uma única fonte, mas me deparei com alguns problemas...

1) quando uma ordem atinge SL ou TP, os textos usuais [sl] ou [tp] não são anexados ao comentário da ordem se o EA adicionou um comentário durante OrderSend().

Esse é um comportamento normal do MT5? Em caso afirmativo, existe uma maneira confiável de determinar se uma ordem realmente atingiu a SL/TP ou foi fechada manualmente?

(tentar decidir verificando o preço de abertura / preço de fechamento / SL / TP não é confiável devido à derrapagem - especialmente se o SL foi movido muito perto do TP).

** Curiosamente, OrdersToString() mostra "[sl x.xxxxxx]" nos comentários, mas a guia Histórico de ordens não mostra essa informação (e ela não está incluída em OrderComment() no testador de estratégia)


2) quando ocorre um fechamento parcial, os comentários sobre a ordem das partes aberta e fechada não mostram "to #xxxxxxxxxxxxxxx" e "from #xxxxxxxxxxx"

novamente, existe uma maneira confiável (e, esperamos, simples) de determinar o que aconteceu com uma determinada ordem?

3) o número do ticket de uma negociação aberta muda quando ela é fechada, portanto, não posso usar OrderTicket() para seguir uma ordem, mas OrderTicketID() parece funcionar como OrderTicket() no MT4 e mantém o mesmo ID para uma negociação fechada.

Esse valor é constante ou pode mudar entre as reinicializações da plataforma?Se for constante, qual é a melhor maneira de usar OrderTicketID() e manter a compatibilidade com o MT4 (já que OrderTicketID() não é uma função do MT4)?

** O OrderTicketID() parece ignorar a diretiva MT4_TICKET_TYPE e é sempre "long"
Документация по MQL5: Константы, перечисления и структуры / Именованные константы / Предопределенные макроподстановки
Документация по MQL5: Константы, перечисления и структуры / Именованные константы / Предопределенные макроподстановки
  • www.mql5.com
//| Expert initialization function                                   | //| Expert deinitialization function                                 | //| Expert tick function                                             | //| test1                                                            |...