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

 
EVGENII SHELIPOV #:

Bom dia a todos!!!

Estou escrevendo código para um EA para Trailing Stop de ordens de grupo a partir do preço médio de uma grade de ordens.

Nenhum erro no registro, mas a rede de arrasto também não funciona. Aqui está o código, por favor, sugira onde está o erro. Obrigado!

A rede de arrasto está no lugar errado!

Deve ser algo parecido com isto

Se o preço é equilibrado + lucro-tral! = TakeProfit, comece a arrasto!

De onde vêm estes dados?

//+----------------------------------------------------------------------------+
//| Трейлинг стоп групповых ордеров                                            |
//+----------------------------------------------------------------------------+
void TrailingGroupOrder()
{
    price += OrderOpenPrice() * OrderLots();
    order_lots += OrderLots() ;
    for(int i = OrdersTotal()-1; i>=0; i--)
    {
     if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

OrderOpenPrice

Devolve o preço aberto do pedido selecionado

duploOrderOpenPrice();

Nota:

A ordem deve ser pré-selecionada usando a função OrderSelect().

 
MakarFX #:

Obrigado).

 
MakarFX #:

Não é aí que a rede de arrasto está parada!

Deve ser assim:

se o preço do breakeven + lucro-tral! = TakeProfit faz a rede de arrasto

Boa tarde Makar!!!!

Tanto quanto eu entendo, esta é a linha em questão. Neste caso, uma ordem de compra:

if(Bid - NormalizeDouble(price / order_lots, Digits) > TrailingStopGroupOrder*Point || OrderStopLoss() == 0)

Makar se você pudesse explicar com mais detalhes

 
MakarFX #:

Não é aí que a rede de arrasto está parada!

Deve ser assim:

se o preço do breakeven + lucro-tral! = TakeProfit faz a rede de arrasto

De onde vêm estes dados?

Você está falando em enigmas hoje, Makar.

Pode haver outra pergunta por que calculamos o preço de breakeven sem verificar????

 
MakarFX #:

Não é aí que a rede de arrasto está parada!

Deve ser assim:

se o preço do breakeven + lucro-tral! = TakeProfit faz a rede de arrasto

De onde vêm estes dados?

OrderOpenPrice

Devolve o preço aberto do pedido selecionado

duploOrderOpenPrice();

Nota:

A ordem deve ser pré-selecionada usando a função OrderSelect().

Sim, eu pensei nisso e você já escreveu

 
EVGENII SHELIPOV #:

Boa tarde Makar!!!!

Tanto quanto eu entendo, esta é a linha em questão. Neste caso, uma ordem de compra:

Makar se você pudesse explicar com mais detalhes

Você tem um grupo de ordens, você define um ponto de equilíbrio e cria uma linha, e isto é melhor feito como uma função separada!

    avg_price = NormalizeDouble(price / order_lots, Digits);
     {
     ObjectDelete(0, "AveragePriceLine");
     ObjectCreate(0,"AveragePriceLine" ,OBJ_HLINE, 0, 0, avg_price);
     ObjectSet("AveragePriceLine",OBJPROP_COLOR, Magenta);
     }

Então você tem o valor de lucro em pips que você quer obter e adicionar / subtrair para / do avg_price

    if (otype == OP_BUY) tp = NormalizeDouble (avg_price + TakeProfitGroupOrder*Point, Digits);
    if (otype == OP_SELL) tp = NormalizeDouble (avg_price - TakeProfitGroupOrder*Point, Digits);

E depois uma função de arrasto separada

para compra: se BID > avg_price = OrderModify()

para vendas: se avg < avg_price = OrderModify()


Infelizmente em seu código eu não vejo ações lógicas (subjetivamente)

 
EVGENII SHELIPOV #:

Isso era o que eu estava pensando e você já escreveu.

Separe as funções para que seja mais fácil para você navegar.

Aqui está um exemplo de OnTick()

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(GetProfitFromStart()>CountProfit || GetProfitFromStart()<CountLoss*-1)
     {
      CloseOrder();
     }
   sl  = MathMax(Stoploss, MarketInfo(_Symbol, MODE_STOPLEVEL)) * Point();
   SL  = NormalizeDouble(sl*Point(),Digits);
   tp  = MathMax(Takeprofit, MarketInfo(_Symbol, MODE_STOPLEVEL)) * Point();
   TP  = NormalizeDouble(tp*Point(),Digits);
   //---
   if(CountOrders()==0&&ObjectGetInteger(0,"lab_Button",OBJPROP_STATE))
     {
      if(TradeSignal()>=0)
        {
         SendOrder(TradeSignal());
        }
     }
   //---
   if (!IsTradeAllowed()) 
     {DrawLABEL("lab_Торговля",0,0,0,clrRed,"Торговля запрещена"); return;} 
   else
     {DrawLABEL("lab_Торговля",0,0,0,clrLime,"Торговля разрешена");}
  }
//+------------------------------------------------------------------+

Como você pode ver, há apenas chamadas de função

 
MakarFX #:

Separe as funções para facilitar a sua navegação.

Aqui está um exemplo de OnTick()

Como você pode ver, há apenas chamadas para funções.

Obrigado, Makar. Vou concentrar meus pensamentos e pensar desta maneira

 
EVGENII SHELIPOV #:

Obrigado, Makar. Vou juntar meus pensamentos e pensar nessa direção.

(Fale mais alto)
 
Pergunta: Como faço para obter uma ordem da custódia da EA? Talvez já existam alguns screenshots ou funções mt4 que eu não conheça. Por favor, esclareçam-me. Não tenho nenhuma ânsia e possibilidades de estudar os mql 3, 4, 5 etc.
Razão: