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

 
Quem sabe - se você fechar parte de uma ordem, seu mágico ou comentário desaparecerá?
 
Renat Akhtyamov:
Quem sabe - se você fechar parte da ordem, seu magik ou comentário desaparecerá?

O magik permanecerá, o bilhete de pedido mudará e o comentário conterá o bilhete de pedido dos pais de#xxxxxxxxxxx. O pedido dos pais terá um ticket de pedido de criança: para#xxxxxxxxxxx

 
Artyom Trishkin:

Magik permanecerá, o bilhete de pedido mudará e o comentário conterá o bilhete de pedido pai de#xxxxxxxxxxx. O pedido dos pais terá um ticket de pedido de criança: para#xxxxxxxxxxx

Ok. Obrigado!
 
geratdc:


Sim, este K também está emvariáveis externas em top hat - talvez seja o valor de retorno de alguma função...


Alexey, o que você pode dizer sobre meu problema? Eu tento anexar uma parada móvel para inverter as ordens. Você já encontrou um problema desse tipo?

E para responder algo sobre este problema, é preciso entender o problema em si. E a partir daí

geratdc:

Preciso de ajuda - tenho 3 ordens de parada, mas exemplo de parada de rastreamento de tutoriais em vídeo :) apenas para ordens não vinculadas, no meu caso elas estão vinculadas por algoritmo, ou seja, o lucro takeprofit é calculado pela soma de três ordens ou uma se eu entrei em uma tendência. Bem, eu pensei em algo, mas meu consultor especializado não começou a ganhar mais - começou a ganhar a mesma quantidade de ordens, mas eu recebo 2 a 3 vezes menos negócios em comparação com minha EA anterior sem travas. Por isso, meu rastro não é um rastro, mas um disparate. Como devo colocá-lo em pedidos vinculados? Alguém pode me dar uma idéia? Não consigo pensar em mais nada. Aqui está o resultado do meu "trailing" - ele é mostrado em azul:

O resultado de 1 teste é anexado. Há ou não uma parada de trilha lá? Eu não entendo. Por que o lucro não foi aumentado no mesmo período? Apenas o número de negócios diminuiu de 2 a 3 vezes?


Eu não consigo entender nada. O mais estranho é"eu inventei algo", mas você já entendeu o que inventou? E isto é"Como faço em encomendas vinculadas". Mas depois há o"Receio não poder pensar em mais nada".

 
Alexey Viktorov:

E para responder a qualquer coisa sobre o problema, é preciso entender o problema em si. E a partir daí.

Eu não consigo entender nada. O mais estranho é que"eu já descobri", mas você sabe o que descobriu? E depois há"Como faço para os mandados vinculados"? Mas depois há o"Receio não poder pensar em mais nada".


Como entendo, os trailing stops não podem ser aplicados corretamente às ordens, portanto devemos prestar muita atenção a esta função CalculateProfit, ou seja, à variável "op" de acordo com a qual as ordens são fechadas se a soma dos lucros de todas as 3 ordens for igual a TakeProfit e tentar arrastá-las através desta variável. Vou tentar pensar em algo nessa direção. Entendo que é difícil lidar com terceiros abracadabra)))).
 
geratdc:

Como entendo, os trailing stops não podem ser aplicados corretamente às ordens, é por isso que devemos analisar mais de perto esta função CalculateProfit, em particular, na variável "op" de acordo com a qual as ordens são fechadas se a soma dos lucros de todas as 3 ordens for igual a TakeProfit e tentar rastrear através desta variável. Vou tentar pensar em algo nessa direção. Entendo que é difícil lidar com terceiros abracadabra)))).
Por que você não pode aplicá-lo? É necessário não anexar ou inventar algo às funções de outras pessoas, e escrever o seu próprio para que elas realizem tudo o que você deseja. Qual poderia ser o problema? Qualquer que seja o número de pedidos, calcular o preço médio e o arrasto a partir dele. Quando alguma condição é preenchida, ao passar por todas as ordens do loop, reordenar suas paradas em um novo nível, que é calculado a partir do preço médio de todas as ordens existentes em uma direção.
 
//+------------------------------------------------------------------+
//|                                     BLACKJACK&HOOKERS TrailX.mq4 |
//|                        Copyright 2017, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern double  Lots           = 0.01;
extern double  TakeProfit     = 1;
extern int     Step           = 1;

extern double  TrailXStep     = 1;
extern double  TrailXStop     = 1;

extern int     MaPeriod       = 100;
extern int     MaShift        = 1;

extern int     Magic          = 123;
extern int     Slippage       = 5;

int timeprev=0;

extern double price,op,cn,tp;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(Digits == 3 || Digits == 5)
      //TakeProfit     *= 10;
      Step           *= 10;
      //TrailXStep     *= 10;
      //TrailXStop     *= 10;
      Slippage       *= 10;

      
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
   if (timeprev == Time[0]) return;
   timeprev = Time[0];
   double maprice=iMA(Symbol(),0,MaPeriod,MaShift,MODE_SMA,PRICE_CLOSE,1); 
   op=CalculateProfit();
   cn=CountTrades();
   tp=TakeProfit;
   if (tp>TakeProfit)
   {
      TakeProfit+=tp;
   }
   
 

 
   if (cn==0 && CountBuy() + CountSell() == 0 && Ask > maprice)
   {
      if (OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "", Magic, 0, Blue)<0)
            Print("Не удалось открыть ордер на покупку");
            
   }
   
   if (cn==0 && CountBuy() + CountSell() == 0 && Bid < maprice)
   {
      if (OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "", Magic, 0, Red)<0)
            Print("Не удалось открыть ордер на продажу");
            
   }
   

   
   if(cn==1 && CountBuy()==1) 
   {
      price=FindLastBuyPrice();
      if((price-Ask)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Red)<1)
            Print("Не удалось открыть ордер на продажу");
      }
   }
   else if(cn==1 && CountSell()==1) 
   {
      price=FindLastSellPrice();
      if((Bid-price)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue)<1)
            Print("Не удалось открыть ордер на покупку");
      }
   }
   
   
   
   if(cn==2 && CountBuy()==1 && CountSell()==1) 
   {
      price=FindLastSellPrice();
      if((price-Bid)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Red)<1)
               Print("Не удалось открыть ордер на продажу");
               
      }
      else 
      price=FindLastSellPrice();
      if((Bid-price)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue)<1)
            Print("Не удалось открыть ордер на покупку");
           
      }
   }
   else if(cn==2 && CountSell()==1 && CountBuy()==1) 
   {
      price=FindLastBuyPrice();
      if((Ask-price)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,0,0,"",Magic,0,Blue)<1)
               Print("Не удалось открыть ордер на продажу");
               
      }
      else 
      price=FindLastBuyPrice();
      if((price-Ask)>=Step*Point)
      {
         if(OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,"",Magic,0,Red)<1)
            Print("Не удалось открыть ордер на покупку");
           
      }
   }
   
   Trailing();

   if (op>=tp)
   {
         CloseAll();    
   }


}    
//---------------------------------------------------------------------------------------
void Trailing()           
            {  

               if (op > (TakeProfit+TrailXStep))
               {
                  tp=(TakeProfit+TrailXStep);
               }
               if (op > (TakeProfit+TrailXStep-TrailXStop) && op < (TakeProfit+TrailXStep+TrailXStop))
               {
                  tp=(TakeProfit+TrailXStep-TrailXStop);
               }
               
            }
//---------------------------------------------------------------------------------------
double CalculateProfit()
  {
   double oprofit=0;
   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 || OrderType()==OP_SELL)
              {
               oprofit+=OrderProfit();
              }
           }
        }
     }
   return(oprofit);
  }
//--------------------------------------------------------------------------------------
void CloseAll()
  {
   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(!OrderClose(OrderTicket(),OrderLots(),Bid,Slippage))
                  Print("Не удалось закрыть ордер на покупку");
              }
            if(OrderType()==OP_SELL)
              {
               if(!OrderClose(OrderTicket(),OrderLots(),Ask,Slippage))
                  Print("Не удалось закрыть ордер на продажу");
              }
           }
        }
     }
  }
//---------------------------------------------------------------------------------------------------
double FindLastBuyPrice()
  {
   int oldticket,ticket= 0;
   double oldopenprice = 0;
   for(int cnt=OrdersTotal()-1; cnt>=0; cnt--)
     {
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY)
           {
            oldticket=OrderTicket();
            if(oldticket>ticket)
              {
               ticket=oldticket;
               oldopenprice=OrderOpenPrice();
              }
           }
        }
     }
   return(oldopenprice);
  }
//---------------------------------------------------------------------------------------------------
double FindLastSellPrice()
  {
   int oldticket,ticket= 0;
   double oldopenprice = 0;
   for(int cnt=OrdersTotal()-1; cnt>=0; cnt--)
     {
      if(OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_SELL)
           {
            oldticket=OrderTicket();
            if(oldticket>ticket)
              {
               ticket=oldticket;
               oldopenprice=OrderOpenPrice();
              }
           }
        }
     }
   return(oldopenprice);
  }
//----------------------------------------------------------------------------------------------
int CountBuy()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_BUY)
            count++;
        }
     }
   return(count);
  }
//----------------------------------------------------------------------------------------------
int CountSell()
  {
   int count=0;
   for(int trade=OrdersTotal()-1; trade>=0; trade--)
     {
      if(OrderSelect(trade,SELECT_BY_POS,MODE_TRADES))
        {
         if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()==OP_SELL)
            count++;
        }
     }
   return(count);
  }
//+---------------------------------------------------------------------------------+
int CountTrades()
{
    int count=0;
    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 || OrderType() == OP_SELL)
                  count++; 
         }
      }
      return(count);
}
//----------------------------------------------------------------------------------+
int FindLastOrderType()
{
      for(int i = OrdersTotal()-1; i>=0; i--)
      {
         if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
         {
            if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
            return(OrderType());
         } 
      }
      return(-1);
}
//----------------------------------------------------------------------------------+

Esta é uma variante da função Trailing by CalculateProfit(), ambas as variantes trailing têm os mesmos indicadores na negociação - tanto em número de negócios como em lucros. Os lucros não são muitos - agora vou adicionar volatilidade e indicadores de entrada mais precisos. Eu acho que um e o mesmo indicador pode resolver esses problemas, certo? Digamos, que analisa as últimas 5 barras ou algo parecido. Como são chamados esses indicadores de barra? E qual é o melhor cronograma? Compartilhe seus pensamentos, por favor, como posso conseguir dois pássaros com um indicador ... Eu tenho dois pássaros de uma cajadada só :)

Como você as barras de fuga neste EA?

 
Alexey Viktorov:
Por que você não pode aplicá-lo? Você não precisa anexar ou inventar algo à função de outra pessoa, mas escrever o seu para que ele faça o que você quer que ele faça. Qual poderia ser o problema? Qualquer que seja o número de pedidos, calcular o preço médio e o arrasto a partir dele. Quando alguma condição é preenchida, ao passar por todas as ordens do loop, reordenar suas paradas em um novo nível que é calculado a partir do preço médio de todas as ordens de uma direção.

Poupei-o, obrigado. Eu acho que ainda não. Eu deveria ter uma biblioteca na minha cabeça de códigos e funções, enquanto nos tutoriais em vídeo passamos por todas as coisas que eu implementei até agora. Talvez eu melhore e ponha em prática seus conselhos. O que eu inventei hoje, parece uma rede de arrasto? Bem, o Expert Advisor arrasta de acordo com os relatórios, mas eu não sei qual deles é o correto - a rede de arrasto incorreta apenas aumentará a probabilidade de perda. Eu diria que tem uma probabilidade de fracasso de 0,9, mais ou menos assim)))) Eu diria que tem muito medo de planos e o indicador é fraco agora - estupidamente nos juntamos à tendência e quando temos 3 pedidos e o mercado muda de repente de direção e nos dá um drawdown - perdemos.
 
geratdc:

Poupei-o, obrigado. Ainda não consigo pensar assim. Devo ter uma biblioteca na minha cabeça de códigos e funções, e já passei pelos tutoriais em vídeo, é o que estou usando agora. Talvez eu melhore e ponha em prática seus conselhos. O que eu inventei hoje, parece uma rede de arrasto? Bem, o Expert Advisor arrasta de acordo com os relatórios, mas eu não sei qual deles é o correto - a rede de arrasto incorreta apenas aumentará a probabilidade de perda. Eu diria que tem uma probabilidade de fracasso de 0,9, mais ou menos assim)))) Eu diria que tem muito medo de planos e o indicador está fraco agora - estupidamente nos juntamos à tendência e quando temos 3 pedidos e o mercado muda repentinamente de direção e nos dá um drawdown - perdemos.

Bem, tentarei fazer minha parte mais para educá-lo.

Eu me dirijo a você como "você" quando eu o enviar. Tenho uma foto do ponteiro...

Por favor me diga, não parece errado chamar a mesma função 5 vezes no mesmo carrapato? Mas isso é metade do problema. Esta função percorre todas as ordens. E tudo isso 5 vezes em um só tique... E eu conto 4 funções desse tipo. Podemos facilmente encaixar mais 3 funções com o laço para pesquisar todos os pedidos sem ter que racionar nossos cérebros.

Aqui estão dois deles.

if (cn==0 && CountBuy() + CountSell() == 0 && Ask > maprice)
if (cn==0 && CountBuy() + CountSell() == 0 && Bid < maprice)
if(cn==1 && CountBuy()==1)


else if(cn==1 && CountSell()==1) 
if(cn==2 && CountBuy()==1 && CountSell()==1) 


else if(cn==2 && CountSell()==1 && CountBuy()==1)

Estes são .

Trailing();


}    
//---------------------------------------------------------------------------------------
void Trailing()           
            {  

               if (op > (TakeProfit+TrailXStep))
               {
                  tp=(TakeProfit+TrailXStep);
               }
               if (op > (TakeProfit+TrailXStep-TrailXStop) && op < (TakeProfit+TrailXStep+TrailXStop))
               {
                  tp=(TakeProfit+TrailXStep-TrailXStop);
               }
               
            }


Não está nem perto de ser seguido.

Para entender isto, precisamos entender claramente a definição de trilha. Não consigo me lembrar literalmente, mas pode ser descrito da seguinte maneira: "Moving StopLoss level following the price in order to decrease possible losses or increase "guaranteed" profit.


E isto

extern double price,op,cn,tp;

como é quando você dirige o Expert Advisor? Provavelmente quatro linhas... eles são necessários?


Uma última coisa para hoje: você não precisa ter uma biblioteca em sua cabeça. Basta ter documentação e saber como utilizá-la. Ainda não consigo me lembrar de todos os parâmetros do iMA(_Symbol, _Period, ,,,,,) e, além disso, escrevo somente depois de ver a documentação. E assim, quase todas as funções. Felizmente, eles fizeram pontas de ferramentas não há muito tempo, o que não ajuda muito. Eu não estou tentando memorizar como escrever estes ou aqueles enumeros. Por isso, tenho que olhar sempre a documentação.

 

Você pode me dizer qual função verifica o status desta caixa de seleção?


Razão: