Com a diretiva #define MT4ORDERS_FASTHISTORY_OFF ativada, ele não compila - gera muitos erros.
Anteriormente, tive que ativar essa diretiva porque algumas funcionalidades (discutidas aqui ) usadas no artigo não estão disponíveis sem ela. Se a funcionalidade ainda for reduzida, é desejável corrigi-la.
что такой простой код не работал корректно в MT5 со старой версией библиотеки. Было бы очень желательно указать как минимум в шапке комменатриев исходника. а поиск соответствующего выхода как раз обложен условной компиляцией на MT4ORDERS
Gostaria de saber se é possível vencer o Testador em uma velocidade em que não deveria haver nenhuma chance?
Escrevi um Expert Advisor "sem chances" - otimizado ao máximo para velocidade.
#include <MT4Orders.mqh> // https://www.mql5.com/pt/code/16006inputint inAmountMagics = 50; // Quantos TCs devem ser emulados// Abrir uma posição e uma ordem para cada TS. Código MT4 para fins de brevidade.voidOnInit()
{
MqlTick Tick;
if (SymbolInfoTick(_Symbol, Tick))
for (int i = 0; i < inAmountMagics; i++)
{
OrderSend(_Symbol, OP_BUY, 1, Tick.ask, 0, 0, 0, NULL, i);
OrderSend(_Symbol, OP_BUYLIMIT, 1, Tick.ask - 1 e4*_Point, 0, 0, 0, NULL, i);
}
}
// Colete informações das posições/ordens corretas. Código MT5 rápido ao máximo.double CountOrders( constint Type, constint Magic )
{
double Res = 0;
if (Type <= OP_SELL)
{
for (int i = PositionsTotal() - 1; i >= 0; i--)
if (PositionGetTicket(i) && (PositionGetInteger(POSITION_TYPE) == Type) && PositionGetInteger(POSITION_MAGIC) == Magic)
Res += PositionGetDouble(POSITION_PRICE_OPEN) + PositionGetDouble(POSITION_PRICE_CURRENT) +
PositionGetDouble(POSITION_TP) + PositionGetDouble(POSITION_SL);
}
elsefor (int i = OrdersTotal(true) - 1; i >= 0; i--)
if (OrderGetTicket(i) && (OrderGetInteger(ORDER_TYPE) == Type) && OrderGetInteger(ORDER_MAGIC) == Magic)
Res += OrderGetDouble(ORDER_PRICE_OPEN) + OrderGetDouble(ORDER_PRICE_CURRENT) +
OrderGetDouble(ORDER_TP) + OrderGetDouble(ORDER_SL);
return(Res);
}
// Número para controlar a correção de implementações alternativas.double OnTesterValue = 0;
doubleOnTester() { return(OnTesterValue); }
voidOnTick()
{
// Simular a operação em todos os TCs.for (int i = 0; i < inAmountMagics; i++)
OnTesterValue += CountOrders(POSITION_TYPE_BUY, i) +
CountOrders(POSITION_TYPE_SELL, i) +
CountOrders(ORDER_TYPE_BUY_LIMIT, i) +
CountOrders(ORDER_TYPE_SELL_LIMIT, i);
}
Pelo código, você pode argumentar que ele foi escrito para ser lento. Mas o código emula o trabalho de muitos "TS". E muitos TSs funcionam exatamente da mesma maneira - em primeiro lugar, eles encontram suas posições/ordens.
OnTester result 54790620.97344553
EURCAD,M1: 192394 ticks, 1440 bars generated. Environment synchronized in 0:00:00.023. Test passed in 0:01:21.775 (including ticks preprocessing 0:00:00.016).
81 segundos para executar. Para um dia de ticks reais, algo muito grande. Mas o que está lá.
// Lista de modificações:// 20.07.2022// Adição: Adicionado OrderLotsOpen() - posição completa/volume da ordem antes de fechar/excluir. Funciona corretamente apenas no modo ByPass.
Usando o mesmo exemplo (abriu 1 lote e fechou-o gradualmente em 0,1, 0,2, 0,3 e 0,4 lotes), mas com uma visualização diferente.
OrderLotsOpen() em quadros vermelhos na parte superior da imagem.
bool isCopyHistory2(string u_symbol, int master_ticket)
{
int ticket_copy;
bool is_exists = false;
// recuperação de informações do histórico comercialfor(int i = 0; i < OrdersHistoryTotal(); i++)
{
//---- verificar o resultado da seleçãoif(OrderSelect(i, SELECT_BY_POS, MODE_HISTORY) == false)
{
Print("Access to history failed with error (", GetLastError(), ")");
continue;
}
// algum trabalho com a ordem
ticket_copy = (int)extract_master_ticket(OrderComment());
if(ticket_copy == master_ticket)
{
//print-for-debug
Print("c ticket: ", OrderTicket()); // ==> esse tíquete não está correto no MT5
is_exists = true;
break;
}
}
//---if(!is_exists)
Print("New Signal #" + (string)master_ticket);
return(is_exists);
}
// Lista de alterações:// 13.03.2019// Adicionar: Adicionado OrderTicketID() - PositionID of an MT5 transaction or MT5 position, and the ticket of a pending MT4 order.
Com a diretiva #define MT4ORDERS_FASTHISTORY_OFF ativada, ele não compila - gera muitos erros.
Anteriormente, tive que ativar essa diretiva porque algumas funcionalidades (discutidas aqui ) usadas no artigo não estão disponíveis sem ela. Se a funcionalidade ainda for reduzida, é desejável corrigi-la.
Com a diretiva #define MT4ORDERS_FASTHISTORY_OFF ativada, ele não é compilado e gera muitos erros.
Esse é um vestígio histórico que não consigo remover.
A MQ criou tantas dores de cabeça que só vale a pena usar as variantes mais sofisticadas.
Deveria haver uma grande atualização da biblioteca, apesar da estranha falta de relatórios de erros. Ela ainda não está pronta.
OrderSelect(i, SELECT_BY_POS)Nessa operação, sempre há posições abertas nos índices mais baixos e ordens pendentes nos índices mais altos.
Com a ajuda desse fato, é possível acelerar um pouco a busca pelas ordens MT4 necessárias.
Gostaria de saber se é possível vencer o Testador em uma velocidade em que não deveria haver nenhuma chance?
Escrevi um Expert Advisor "sem chances" - otimizado ao máximo para velocidade.
Pelo código, você pode argumentar que ele foi escrito para ser lento. Mas o código emula o trabalho de muitos "TS". E muitos TSs funcionam exatamente da mesma maneira - em primeiro lugar, eles encontram suas posições/ordens.
81 segundos para executar. Para um dia de ticks reais, algo muito grande. Mas o que está lá.81 segundos para concluir. Para um dia com ticks reais, isso é muito. Mas o que é.
Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação
Bibliotecas: Virtual
fxsaber, 2023.03.01 20:36
A soma de verificação corresponde. Consegui aumentar a velocidade quase duas vezes.
Não foi fácil, mas funcionou.
Escreveu um EA "sem chance" - otimizado ao máximo para velocidade.
Fórum sobre negociação, sistemas de negociação automatizados e teste de estratégias de negociação
Bibliotecas: MT4Orders
fxsaber, 2022.07.20 00:39
Usando o mesmo exemplo (abriu 1 lote e fechou-o gradualmente em 0,1, 0,2, 0,3 e 0,4 lotes), mas com uma visualização diferente.

OrderLotsOpen() em quadros vermelhos na parte superior da imagem.Olá,
Parece que há um erro no OrderTicket()
Não é o ticket correto do histórico do MT5
Este é o meu código:
Parece que há um bug em OrderTicket()
Não é o ticket correto do histórico do MT5
Aparentemente, você deseja obtê-lo.
Os motivos estão detalhados aqui.
Aparentemente, você deseja obtê-lo.
Os motivos estão detalhados aqui.
Muito obrigado.
Está tudo bem com
OrderTicketID()