Quaisquer perguntas de recém-chegados sobre MQL4 e MQL5, ajuda e discussão sobre algoritmos e códigos - página 1028

 

Por que a EA não pode mudar o preço do pedido pendente (parada de venda) para um mais lucrativo?


Esta é a função que define a necessidade de mover o preço aberto de uma ordem pendente

if(orders_total > 0 && position_total == 0)
     {
      OrderGetTicket(0)
      if(OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_BUY_STOP)
        {
         if(OrderGetDouble(ORDER_PRICE_OPEN) - SymbolInfoDouble(_Symbol,SYMBOL_ASK) > ((double)(dist+1)) * _Point) Mode_Order("M",SymbolInfoDouble(_Symbol,SYMBOL_ASK) + ((double)dist * _Point));
        }
      else if(OrderGetInteger(ORDER_TYPE) == ORDER_TYPE_SELL_STOP)
        {
         if(SymbolInfoDouble(_Symbol,SYMBOL_BID) - OrderGetDouble(ORDER_PRICE_OPEN) > ((double)(dist+1)) * _Point) Mode_Order("M",SymbolInfoDouble(_Symbol,SYMBOL_BID) - ((double)dist * _Point));
        };
     };


... e esta é a função que já move o preço em aberto da ordem pendente

void Mode_Order(string act, double price)
  {
   
   MqlTradeRequest request; ZeroMemory(request);
   MqlTradeResult  result;  ZeroMemory(result);
   
   request.symbol = _Symbol;
   
   if(act == "S")
     {
      request.action   = TRADE_ACTION_SLTP;
      request.position = PositionGetTicket(0);
      request.sl       = (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY ? PositionGetDouble(POSITION_PRICE_OPEN) - ((double)stop * _Point) : PositionGetDouble(POSITION_PRICE_OPEN) + ((double)stop * _Point));
      request.tp       = (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY ? PositionGetDouble(POSITION_PRICE_OPEN) + ((double)profit * _Point) : PositionGetDouble(POSITION_PRICE_OPEN) - ((double)profit * _Point));
     }
   else
     {
      request.action   = TRADE_ACTION_MODIFY;
      request.position = OrderGetTicket(0);
      request.price    = NormalizeDouble(price,_Digits);
     };
   
   if(!OrderSend(request,result)) Print("Не удалось изменить параметры ордера. Код ошибки "+(string)result.retcode);
   
  }
 
Alexandr Sokolov:

Por que a EA não pode mudar o preço do pedido pendente (parada de venda) para um mais lucrativo?


Esta é a função que define se o preço em aberto de uma ordem pendente deve ser movido


... E esta é a função que já move o preço em aberto da ordem pendente

Esta ordem é a única? A modificação do SLTP funciona? Se não, o take and stop deve ser normalizado

dist1 é igual a quê? Aqui a ordem deve ser definida em vez da posição

request.position = OrderGetTicket(0);
 
Aleksey Mavrin:

A ordem é a única? A modificação do SLTP funciona? Se não, você deve normalizar a tomada e parar

dist1 é igual a quê? Deveríamos estabelecer a ordem em vez da posição

Muito obrigado! Eu não tinha notado, parece ser uma bagatela - mas não funciona sem ela


... A ordem é a única, tudo funciona, o único problema foi mover a ordem pendente

 
Alexandr Sokolov:

Muito obrigado! Eu não tinha notado isso, aparentemente uma coisa pequena - mas não funciona sem isso


... A ordem é a única, tudo funciona, o único problema foi mover a ordem pendente

1. Por favor 2. Hmm, eu vou normalizá-lo de qualquer maneira, contra o pecado. Seu preço é obtido a partir do inteiro multiplicado por um duplo normalizado, no caso geral aparentemente também é obtido um duplo normalizado, mas em algum lugar eu li que nem sempre, algumas vezes por ano, ele pode obter

algo como 1.132500000000000000000000001

e depois problemas, no momento certo, quando a tendência mais poderosa não funciona, e a hipoteca novamente, olá))))

Eu poderia estar errado, mas eu mesmo tranquilizo e normalizo sempre.

 
Aleksey Mavrin:

1. Por favor, 2. Hmmm, estou normalizando de qualquer forma por causa do pecado. Você recebe o preço de um todo multiplicado por um dobro normalizado, no caso geral aparentemente você também recebe um dobro normalizado, mas eu li em algum lugar que nem sempre, um par de vezes por ano você pode receber

algo como 1.132500000000000000000000001

e depois problemas, no momento certo, quando a tendência mais poderosa não funciona, e a hipoteca novamente, olá))))

Eu poderia estar errado, mas eu mesmo tranquilizo e normalizo sempre.

As operações matemáticas em dois números normalizados dão resultados não normalizados.

A fim de obter um resultado normalizado de operações matemáticas com números reais, você deve retornar o valor normalizado destas operações matemáticas.

Norma(1.11111) + Norma(2.22222) = NoNorm(res)

Norm(1.11111 + 2.22222) = Norm(res)

 

@ Artyom Trishkin

Anexei o código com este tema.

Eu encontrei seu código na base de código. Houve um problema ao alterar o código.

A parte de entrada tem as seguintes entradas:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
input eTradeType                                    Inp_element_12357534       = TRADETYPE_BUY;                        // First Trade Type
input double                                        Inp_element_3632865        = 0.01;                                 // Start Lot
input double                                        Inp_element_12844407       = 1.0;                                  // Lot Multiplier
input #ifdef __MQL4__ int #else long #endif          Inp_element_2542795        = 400;                                  // Grid Step, points
input #ifdef __MQL4__ int #else long #endif          Inp_element_3135636        = 100;                                  // Target, points
input #ifdef __MQL4__ int #else long #endif          Inp_element_3634918        = 7373;                                 // Magic
sinput string                                       Inp_element_3640359        = "Grid EA";                            // Comment
//+------------------------------------------------------------------+

Quero que este parâmetro mude enquanto o programa estiver em execução: input #ifdef __MQL4__ INT #else long #endif Inp_element_2542795 = 400 // Step grid, pontos.

Por favor, me informe o que posso fazer para mudar este parâmetro cada vez que o executo.

Arquivos anexados:
Manage.mq5  859 kb
 
jaffer wilson :

@ Artyom Trishkin

Anexei o código com este tema.

Eu encontrei seu código na base de código. Houve um problema ao alterar o código.

A parte de entrada tem as seguintes entradas:

Quero que este parâmetro mude enquanto o programa estiver em execução: input #ifdef __MQL4__ INT #else long #endif Inp_element_2542795 = 400 // Step grid, pontos.

Por favor, me informe o que posso fazer para mudar este parâmetro cada vez que o executo.

Honestamente, a questão não é clara.

Você deseja alterar o parâmetro de entrada Inp_element_2542795 toda vez que você inicia o conselheiro?

Bem, altere-o nas configurações do assessor quando ele começar. Ou, se o conselheiro já estiver em funcionamento, e você quiser alterar este parâmetro, então pressione F7 - a janela de ajustes do conselheiro aparecerá, e altere este parâmetro nele.

 
Artyom Trishkin:

Honestamente, a questão não é clara.

Você deseja alterar o parâmetro de entrada Inp_element_2542795 toda vez que você inicia o conselheiro?

Bem, altere-o nas configurações do assessor quando ele começar. Ou, se o conselheiro já estiver em funcionamento, e você quiser alterar este parâmetro, então pressione F7 - a janela de ajustes do conselheiro aparecerá, e altere este parâmetro nele.

Deixe-me esclarecer. Acho que o problema é a tradução. Na verdade, é um valor de entrada. e não estou chegando onde este valor está sendo usado para o cálculo. Não quero que toda vez que 400 pontos sejam utilizados. Eu quero continuar mudando os valores. Quero mudar os valores para um cálculo adequado. Você pode me ajudar onde eu posso fazer mudanças para que o valor se torne dinâmico durante a execução do programa?

 
jaffer wilson :

Deixe-me esclarecê-lo. Acho que o problema está na tradução. Na verdade, é um valor de entrada. e não entendo onde este valor é usado para calcular. Não quero que 400 pontos sejam usados todas as vezes. Eu quero continuar mudando os valores. Quero mudar os valores para um cálculo adequado. Você pode me ajudar onde eu posso fazer mudanças para que o valor se torne dinâmico enquanto o programa está em execução?

Criar uma nova variável global. Defina o valor do parâmetro de entradaInp_element_2542795 para ele:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
cRunner *Runner;
long g_element_2542795=0;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int OnInit(void)
  {
//===============
   g_element_2542795=Inp_element_2542795;
//===============
/* DEBUG MACROS' START */ TRACEERRORS_START
//===============
 
//===============
   Runner=new cRunner;
//===============
 

e substituir toda a entrada da string Inp_element_2542795 por esta nova variável g_element_2542795 usando Ctrl + H

 

Olá!

Estou apenas aprendendo MQL5, então estou pedindo ajuda.

Há uma classe -https://www.mql5.com/ru/code/18721(Vlad Karputova). Graças a Vladimir.

Ele calcula o lucro (em pontos, em moeda de depósito, swap e comissão), mas não tem filtro para Magik.

Adicionei filtro para Magik (não tenho certeza se está correto, então não quero postar com erros).

Consegui o resultado.

Search deals with POSITION_IDENTIFIER 53821539
DEAL_ENTRY_IN, DEAL_TYPE_SELL, price 1.11164, Deal_Symbol EURUSD, Deal_Magic  222, volume 0.03, commission -0.05, swap 0.00, profit 0.00
DEAL_ENTRY_OUT, DEAL_TYPE_BUY, price 1.11170, Deal_Symbol EURUSD, Deal_Magic  0, volume 0.03, commission -0.05, swap 0.00, profit -0.18
Profit in points -6.0, commission -0.10, swap 0.00, profit -0.18

Search deals with POSITION_IDENTIFIER 53821617
DEAL_ENTRY_IN, DEAL_TYPE_SELL, price 1.11159, Deal_Symbol EURUSD, Deal_Magic  222, volume 0.03, commission -0.05, swap 0.00, profit 0.00
DEAL_ENTRY_OUT, DEAL_TYPE_BUY, price 1.11172, Deal_Symbol EURUSD, Deal_Magic  0, volume 0.03, commission -0.05, swap 0.00, profit -0.39
Profit in points -13.0, commission -0.10, swap 0.00, profit -0.39

Search deals with POSITION_IDENTIFIER 53821750
DEAL_ENTRY_IN, DEAL_TYPE_SELL, price 1.11163, Deal_Symbol EURUSD, Deal_Magic  222, volume 0.03, commission -0.05, swap 0.00, profit 0.00
DEAL_ENTRY_OUT, DEAL_TYPE_BUY, price 1.11169, Deal_Symbol EURUSD, Deal_Magic  0, volume 0.03, commission -0.05, swap 0.00, profit -0.18
Profit in points -6.0, commission -0.10, swap 0.00, profit -0.18

Search deals with POSITION_IDENTIFIER 53847372
DEAL_ENTRY_IN, DEAL_TYPE_SELL, price 1.10971, Deal_Symbol EURUSD, Deal_Magic  222, volume 0.03, commission -0.05, swap 0.00, profit 0.00
DEAL_ENTRY_OUT, DEAL_TYPE_BUY, price 1.11002, Deal_Symbol EURUSD, Deal_Magic  0, volume 0.03, commission -0.05, swap 0.00, profit -0.93
Profit in points -31.0, commission -0.10, swap 0.00, profit -0.93

Search deals with POSITION_IDENTIFIER 53848455
DEAL_ENTRY_IN, DEAL_TYPE_SELL, price 1.10997, Deal_Symbol EURUSD, Deal_Magic  222, volume 0.03, commission -0.05, swap 0.00, profit 0.00
DEAL_ENTRY_OUT, DEAL_TYPE_BUY, price 1.10741, Deal_Symbol EURUSD, Deal_Magic  0, volume 0.03, commission -0.05, swap 0.00, profit 7.68
Profit in points 256.0, commission -0.10, swap 0.00, profit 7.68

Search deals with POSITION_IDENTIFIER 53856130
DEAL_ENTRY_IN, DEAL_TYPE_SELL, price 1.10735, Deal_Symbol EURUSD, Deal_Magic  222, volume 0.03, commission -0.05, swap 0.00, profit 0.00
DEAL_ENTRY_OUT, DEAL_TYPE_BUY, price 1.10769, Deal_Symbol EURUSD, Deal_Magic  0, volume 0.03, commission -0.05, swap 0.00, profit -1.02
Profit in points -34.0, commission -0.10, swap 0.00, profit -1.02
All_Profit in points 166.0, All_commission -0.60, All_swap 0.00, All_profit 4.98
All_Profit in points 0.0, All_commission 0.00, All_swap 0.00, All_profit 0.00

O resultado para a classe original e a classe com filtro da Magik coincidem. Mas, há um ponto aqui.

1.Por que OUT trades têm magia zero.

2.Se eu corrigi incorretamente a classe (adicionando um magik) - por favor, faça a mudança necessária na classe original e a poste.

(E seria bom passar um símbolo para a classe como um parâmetro).

Obrigado pela ajuda.

HistoryPositionInfo version 2
HistoryPositionInfo version 2
  • www.mql5.com
Новое в версии 2: функция GetProfitInPoints осталась, но рекомендуется теперь использовать новую функцию GetProfit: Функция GetProfit возвращает для восстановленной позиции, кроме прибыли в пунктах: комиссию, своп и прибыль в деньгах. Класс CHistoryPositionInfo предназначен для получения прибыли позиции в пунктах, комиссии, свопа и прибыли в...