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

 
законопослушный гражданин #:

Eu sei.

Eu escrevi.

a parada e a tomada são movidas instantaneamente um número infinito de vezes

Você deve obter o SL do pedido sendo modificado e compará-lo com o SL calculado. Se forem iguais, o robô não deve fazer nada até que o SL calculado exceda o SL da ordem que está sendo processada. Como comparar dois valores duplos: ou compare NodmalizeDouble(valor, Dígitos) (de cada valor) ou EqualDoubleshttps://www.mql5.com/ru/docs/basis/types/double

Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
Документация по MQL5: Основы языка / Типы данных / Вещественные типы (double, float)
  • www.mql5.com
Вещественные типы (double, float) - Типы данных - Основы языка - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
законопослушный гражданин #:

Eu sei.


Você o define corretamente. Você mudou alguma coisa dentro da função TrailingOrders()?

 
Mihail Matkovskij #:

Você deve obter o SL do pedido sendo modificado e compará-lo com o SL calculado. ...

Em geral, as regras são as seguintes.

  • O SL calculado é menor que o SL do pedido (menos favorável) - não fazer nada
  • O SL calculado é igual ao SL do pedido - não fazer nada
  • O SL calculado excede o SL do pedido (mais rentável) - modificá-lo com o valor calculado
Estas regras de arrasto podem ser usadas para construir quase qualquer rede de arrasto com qualquer algoritmo de cálculo SL.
 
Tretyakov Rostyslav #:

Você o define corretamente. Você mudou alguma coisa dentro da função TrailingOrders()?

Eu o mudei e o coloquei "como está" e o resultado foi o mesmo.

 
законопослушный гражданин #:

Eu o mudei e o coloquei "como está" e o resultado é o mesmo.

É necessário ver os parâmetros de entrada, pois o registro mostra que a rede de arrasto funciona corretamente
 
Tretyakov Rostyslav #:
Precisamos ver os parâmetros de entrada, pois de acordo com o registro, a rede de arrasto funciona corretamente

2021.12.24 16:10:14.788 2021.12.17 00:00:00 111 - cópia: Lote=0,01; StopLoss=200; TakeProfit=560; Slippage=3; Magic=1; K_Martin1=0,01; K_Martin2=1,9; K_Martin3=1,4; OrderClose=3; OrderClose2=5; DigitsLot=2; PeriodMA=21; MovingShift=1;


 
законопослушный гражданин #:

2021.12.24 16:10:14.788 2021.12.17 00:00:00 111 - cópia: Lote=0,01; StopLoss=200; TakeProfit=560; Slippage=3; Magic=1; K_Martin1=0,01; K_Martin2=1,9; K_Martin3=1,4; OrderClose=3; OrderClose2=5; DigitsLot=2; PeriodMA=21; MovingShift=1;


talvez eu tenha colocado a função no código incorretamente?

void OnTick()
  {
// Получим значение индикатора
   dMA = iMA(Symbol(), 0,PeriodMA, MovingShift, MODE_SMA, PRICE_CLOSE, 0); // MODE_SMA - простое усреднение , значение 0. PRICE_CLOSE- цена закрытия, значение 0.
   TrailingOrders();
// Если нет открытых ордеров, то входим в условие
      if(CountOrders()==0)
     {

// Если появился сигнал на покупку, то откроем ордер на покупку
      if(bSignalBuy() == true)
         vOrderOpenBuy();

// Если появился сигнал на продажу, то откроем ордер на продажу
      if(bSignalSell() == true)
         vOrderOpenSell();
     } 
       DrawLABEL("nextlot",1,5,0,Color1(),StringConcatenate("CURRENT LOT: ",DoubleToStr(LOT(),2)));
       DrawLABEL("currentlot",1,5,0,Color2(),StringConcatenate("NEXT LOT: ",DoubleToStr(LOT(),2))); 
  }

e colocar a própria função separadamente

//-------------------------------------------------------------------+

void TrailingOrders()
  {
   for(int i = OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
           {
            if(OrderType() == OP_BUY)
              {
               if(Bid >= OrderOpenPrice()+(TakeProfit*0.75*_Point) && OrderStopLoss()<OrderOpenPrice()-20*_Point)
                 {
                  if(OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss()+20*_Point, OrderTakeProfit()+20*_Point, 0))
                     Print("Модификации ордера на покупку успешна!");
                  else
                     Print("Ошибка модификации ордера на покупку! - ",GetLastError());
                 }
               if(Bid >= OrderOpenPrice()+(TakeProfit*0.9*_Point) && OrderStopLoss()>=OrderOpenPrice()-20*_Point)
                 {
                  if(OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss()+30*_Point, OrderTakeProfit()+10*_Point, 0))
                     Print("Модификации ордера на покупку успешна!");
                  else
                     Print("Ошибка модификации ордера на покупку! - ",GetLastError());
                 }
              }
           }
        }
     }
  }
 
законопослушный гражданин #:

eu coloquei a função no código incorretamente?

e colocar a própria função separadamente

//-------------------------------------------------------------------+

void TrailingOrders()
  {
   
   for(int i = OrdersTotal()-1; i>=0; i--)
     {
      if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
        {
         if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
           {
            if(OrderType() == OP_BUY)
              {
               if(Bid >= OrderOpenPrice()+(TakeProfit*0.75*_Point) && OrderStopLoss()<=OrderOpenPrice()-StopLoss*_Point)
                 {
                  if(OrderModify(OrderTicket(), OrderOpenPrice(), OrderOpenPrice()-(StopLoss+20)*_Point, OrderTakeProfit()+20*_Point, 0))
                     Print("Модификации ордера на покупку успешна!");
                  else
                     Print("Ошибка модификации ордера на покупку! - ",GetLastError());
                 }
               if(Bid >= OrderOpenPrice()+(TakeProfit*0.9*_Point) && OrderStopLoss()>=OrderOpenPrice()-(StopLoss+20)*_Point)
                 {
                  if(OrderModify(OrderTicket(), OrderOpenPrice(), OrderStopLoss()+30*_Point, OrderTakeProfit()+10*_Point, 0))
                     Print("Модификации ордера на покупку успешна!");
                  else
                     Print("Ошибка модификации ордера на покупку! - ",GetLastError());
                 }
              }
           }
        }
     }
  }

A trilha está correta.

Experimente assim

 
Tretyakov Rostyslav #:

O carrinho está de pé corretamente.

Tente isto.

decolar para o espaço

a parada pára primeiro, depois voa instantaneamente para o espaço junto com o take (fechando o pedido no caminho)

esta não é a questão como eu a entendo.

me corrija se eu estiver errado: nulo OnTick()

se não houver ordens abertas e houver um sinal, então vOrderOpenBuy() / vOrderOpenSell()

Depois vem o vOrderModify(int iOTi) - ou seja, eles estabelecem paradas e takei e depois verificam se há erros.

Ou seja, até o fechamento do pedido em stop ou take, não é possível corrigi-lo em termos de rastreamento.

Você precisa de um (máximo dois) múltiplo de parada e tomada.

Se você quiser mudar a parada móvel e ter lucro, então precisará de uma abordagem diferente.

Ainda estou pensando em como implementá-la.

Arquivos anexados:
111.mq4  25 kb
 
законопослушный гражданин #:

decolar para o espaço

a parada primeiro fica de pé, depois voa instantaneamente para o espaço após a tomada (fechando a ordem no caminho)

Este não é o ponto, como eu o entendo.

me corrija se eu estiver errado: nulo OnTick()

se não houver ordens abertas e houver um sinal, então vOrderOpenBuy() / vOrderOpenSell()

Depois vem o vOrderModify(int iOTi) - ou seja, eles estabelecem paradas e takei e depois verificam se há erros.

Ou seja, até o fechamento do pedido em stop ou take, não é possível corrigi-lo em termos de rastreamento.

Você precisa de um (máximo dois) múltiplo de parada e tomada.

Se você quiser mudar o trailing stop e ter lucro, então você deve fazê-lo manualmente.

Ainda estou pensando em como implementá-la.

Correção

2021.12.24 21:31:12.245 2021.11.01 00:00:00  111 inputs: Lot=0.01; StopLoss=200; TakeProfit=400; Slippage=3; Magic=1; K_Martin1=2; K_Martin2=2; K_Martin3=2; OrdersClose=5; OrdersClose2=5; DigitsLot=2; PeriodMA=14; MovingShift=1; 
2021.12.24 21:31:12.292 2021.11.01 00:05:00  111 EURUSD,M5: open #1  buy 0.01 EURUSD at 1.15583 ok
2021.12.24 21:31:12.292 2021.11.01 00:05:00  111 EURUSD,M5: modify #1  buy 0.01 EURUSD at 1.15583 sl: 1.15383 tp: 1.15983 ok
2021.12.24 21:32:52.782 2021.11.01 17:37:18  111 EURUSD,M5: modify #1  buy 0.01 EURUSD at 1.15583 sl: 1.15403 tp: 1.16003 ok
2021.12.24 21:32:52.782 2021.11.01 17:37:18  111 EURUSD,M5: Модификации ордера на покупку успешна!
2021.12.24 21:33:39.178 2021.11.01 19:06:30  111 EURUSD,M5: modify #1  buy 0.01 EURUSD at 1.15583 sl: 1.15433 tp: 1.16013 ok
2021.12.24 21:33:39.178 2021.11.01 19:06:30  111 EURUSD,M5: Модификации ордера на покупку успешна!
2021.12.24 21:34:08.768 2021.11.01 20:12:05  Tester: take profit #1  at 1.16013 (1.16014 / 1.16019)
2021.12.24 21:34:14.632 2021.11.01 20:17:55  Tester: stop button pressed
Arquivos anexados:
111.mq4  25 kb
Razão: