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

 
Nerd Trader:
Por que isCrossing() não retorna 2???? O isCrossing( ) em si tem um segundo se entrada, mas então não há se entrada em OnTick() quando isCrossing() == 2. Que monte de besteiras...

Ambas as condições se encaixam...assim você obtém o primeiro resultado

 
MakarFX:

Ambas as condições se encaixam...assim você obtém o primeiro resultado

Só se encaixa quando Bid == ma. Fixo <= a < (também para >=), mas nada muda.
 
Nerd Trader:
Por que isCrossing() não retorna 2???? O isCrossing( ) em si tem um segundo se entrada, mas então não há se entrada em OnTick() quando isCrossing() == 2. Que monte de besteiras...

Por alguma razão eu também não acho que retorne 1.

Esta condição

if(g_barTime < iTime(NULL,g_timeFrame,0)// и дальше

Diz que foi aberto um novo bar. No primeiro tick da barra abrir == alta == baixa == fechada e == licitação - daí a condição

 && high > ma && Bid <= ma)

ou

 && low < ma && Bid >= ma)
não pode ser cumprida...

Hoje houve uma pergunta sobre a condição se(i != i) Estas condições são aproximadamente as mesmas.

 
OnTick() como está agora no meu editor:
void OnTick()
  {
/*     if(isCrossing() == 1){          
      Print("enter to '1. if (isCrossing)'");
        if(shouldBars(1))         
          Print("angulation is ", shouldAngulation(1));            
    } */

    if(isCrossing() == 2){
      Print("enter to '2. if (isCrossing)'");
      if(shouldBars(2))
        Print("angulation is ", shouldAngulation(2));
        //if(shouldAngulation(2))
          //OpenSell();
    }

   
  }
Se o primeiro bloco é comentado, o segundo bloco é executado. Eu não sei onde está o erro.

P.S.
com a função isCrossing() deixou tudo como está.
 
Alexey Viktorov:

Por alguma razão eu também não acho que retorne 1.

Esta condição

conta sobre a abertura de um novo bar. No primeiro tick do bar aberto == alto == baixo == fechado e == lance - daí, a condição

ou

não pode ser cumprida...

Hoje houve uma pergunta sobre a condição se(i != i) Estas condições são mais ou menos as mesmas.

"1" retorna, fez a depuração de código no MetaEditor.

Além disso, mesmo que tudo seja igual, é apenas no primeiro tique.

 
Nerd Trader:

"1" retorna, fez a depuração de código no MetaEditor.

Além disso, mesmo que tudo seja igual, é apenas no primeiro tique.

Bem, sim, eu estava errado. A nova barra será somente depois que toda a condição for cumprida.

Tente substituir alto e baixo por aberto. Talvez isso não afete muito a estratégia.

 
Nerd Trader:

"1" retorna, fez a depuração de código no MetaEditor.

Além disso, mesmo que tudo seja igual, é apenas no primeiro tique.

Funciona assim

//--- input parameters
input int                  g_maPeriod  = 14;
input int                  g_maShift   = 1;
input ENUM_APPLIED_PRICE   g_maPrice   = PRICE_CLOSE;  //Applied price
input ENUM_MA_METHOD       g_maMethod  = MODE_SMA;    //Method Ma
input ENUM_TIMEFRAMES      g_timeFrame = PERIOD_CURRENT;   //Timeframe for calculate
datetime g_barTime=0;
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   if(g_barTime != iTime(NULL,g_timeFrame,0))
     {
      if(isCrossing()==1)
        {
         Print("enter to '1. if (isCrossing)'"); g_barTime = iTime(NULL,g_timeFrame,0);
        }
      if(isCrossing()==2)
        {
         Print("enter to '2. if (isCrossing)'"); g_barTime = iTime(NULL,g_timeFrame,0);
        }
     }
  }
//+------------------------------------------------------------------+
int isCrossing()
  {  
   int res=0;
   double low = iLow(Symbol(), g_timeFrame, 1);
   double high = iHigh(Symbol(), g_timeFrame, 1);
   double ma = iMA(_Symbol, g_timeFrame, g_maPeriod, g_maShift, g_maMethod, g_maPrice, 0);

   if(high > ma && Bid <= ma) res=1;
  
   if(low < ma && Bid >= ma) res=2;
   return (res);
  }
//+------------------------------------------------------------------+
2021.08.25 09:24:56.629 2021.08.20 23:50:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
2021.08.25 09:24:56.624 2021.08.20 23:45:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.592 2021.08.20 21:35:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.582 2021.08.20 21:05:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
2021.08.25 09:24:56.566 2021.08.20 20:20:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
2021.08.25 09:24:56.554 2021.08.20 18:50:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.553 2021.08.20 18:45:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.553 2021.08.20 18:40:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
 
MakarFX:

Funciona assim.


Eu fiz isso e tudo funciona, apenas as mensagens de isCrossing() são duplicadas, porque o f-e é chamado duas vezes por um tick.

void OnTick()
  {
   if(BarTime != iTime(NULL,0,0)){

     if(isCrossing == 1){
       ...
     }

     if(isCrossing == 2){
       ...
     }
     BarTime = iTime(NULL,0,0); 
  }

int isCrossing()
  {  
    ...

    if(high > ma && Bid <= ma){
      Print("Crossing down");
      return 1;
    } 
  
    if(low < ma && Bid >= ma){
      Print("Crossing up");
      return 2;
    }
   return 0;
  }


Assim, deixei as coisas como estavam, só que agora tudo, desde isCrossing(), volta a variável. Nada é duplicado e tudo funciona. Obrigado a todos :)

void OnTick()
  {
    int iCrossing = isCrossing();

    if(iCrossing == 1){
       ...
    }

    if(iCrossing == 2){
       ...
    }   
  }
 
MakarFX:
2021.08.25 09:24:56.629 2021.08.20 23:50:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
2021.08.25 09:24:56.624 2021.08.20 23:45:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.592 2021.08.20 21:35:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.582 2021.08.20 21:05:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
2021.08.25 09:24:56.566 2021.08.20 20:20:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
2021.08.25 09:24:56.554 2021.08.20 18:50:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.553 2021.08.20 18:45:00  Nerd Trader EURUSD,M5: enter to '2. if (isCrossing)'
2021.08.25 09:24:56.553 2021.08.20 18:40:00  Nerd Trader EURUSD,M5: enter to '1. if (isCrossing)'
Serra agora que você adicionou um tronco. Aqui você também tem mensagens duplicadas :)
 

você pode, por favor, explicar a diferença entre as funções?

para (int j = OrderHistoryTotal()-1; j >= 0; j--)

{

se(OrderSelect(j, SELECT_BY_POS,MODE_HISTORY))

и

int i=OrdensHistóriaTotal();

for(int pos=0; pos<i; pos++)

{

if(OrderSelect(pos, SELECT_BY_POS,MODE_HISTORY))

Razão: