ORDEM EM CIMA DA MEDIA

 

Meu robô vai abrindo ordens normalmente, até de derrepente ele começa a abrir ordem em cima da média.

Se eu deixo assim funciona normalmente:

if(latest_price.last > maCerto

Agora se deu deixo assim da erro:

if(latest_price.last > maTickCerto
      MqlTradeRequest request;
      MqlTradeResult result;
      MqlTick latest_price;
      ZeroMemory(request);
      
      SymbolInfoTick(Symbol(),latest_price);

      high = iHigh(Symbol(),Period(),0);
      low = iLow(Symbol(),Period(),0);
      
      //MOVING AVERAGE
      maHandle = iMA(_Symbol,_Period,EMA_Periodo,0,MODE_EMA,PRICE_CLOSE);
            
      ArraySetAsSeries(maVal,true);
      
      CopyBuffer(maHandle,0,0,3,maVal);
      
      //VOLUME
      volumeHandle = iVolumes(_Symbol,_Period,VOLUME_REAL);
      
      ArraySetAsSeries(volumeVal,true);
      
      CopyBuffer(volumeHandle,0,0,3,volumeVal);
      
      //====== AJUSTE TE VALORES
      double highCerto = NormalizeDouble(high,_Digits);
      double lowCerto = NormalizeDouble(low,_Digits);
      double maCerto = NormalizeDouble(maVal[0],_Digits);     

      double maCerto = NormalizeDouble(maVal[0],_Digits);
      
      double ticksize= SymbolInfoDouble(_Symbol,SYMBOL_TRADE_TICK_SIZE); 
      double maTickCerto = (MathRound(maCerto/ticksize)*ticksize);
        
      if(latest_price.last > maTickCerto && volumeVal[0] >= Volume && PositionSelect(_Symbol) == false)
      {
         request.action = TRADE_ACTION_DEAL;
         request.type = ORDER_TYPE_SELL;
         request.symbol = _Symbol;
         request.volume = Contrato;
         request.type_filling = ORDER_FILLING_FOK;
         request.magic = MagicNumber;
         request.price = latest_price.last;
         request.sl = 0;
         request.tp = 0;
         request.deviation = 0;
         
         OrderSend(request,result);
         
         
         if(result.retcode == TRADE_RETCODE_DONE || result.retcode == TRADE_RETCODE_PLACED)
         {
            request.action = TRADE_ACTION_SLTP;
            
            do Sleep(100); while(PositionSelect(_Symbol) == false);
            double positionOpenPrice = PositionGetDouble(POSITION_PRICE_OPEN);
            
            if(StopLoss > 0) request.sl = positionOpenPrice + StopLoss;
            if(TakeProfit > 0) request.tp = positionOpenPrice - TakeProfit;
            
            if(request.sl > 0 && request.tp > 0) OrderSend(request,result); 
         }
      }

 
northedan:

Meu robô vai abrindo ordens normalmente, até de derrepente ele começa a abrir ordem em cima da média.


Não entendo de programação, mas esta função não faz disparar ordem constantemente?

" if(latest_price.last > maTickCerto && volumeVal[0]"
 
Lucas Tavares:

Não entendo de programação, mas esta função não faz disparar ordem constantemente?

Não, pq ele verifica:
volumeVal[0] >= Volume
 
northedan:


Olá, vou dar duas sugestões.

1) Coloque a definição dos manipuladores e o ArraySetAsSeries no OnInit()..., pois só é necessário defini-los uma vez !

       maHandle = iMA(_Symbol,_Period,EMA_Periodo,0,MODE_EMA,PRICE_CLOSE);
            
      ArraySetAsSeries(maVal,true);

      volumeHandle = iVolumes(_Symbol,_Period,VOLUME_REAL);
      
      ArraySetAsSeries(volumeVal,true);


2) Altere o código.

double maTickCerto = (MathRound(maCerto/ticksize)*ticksize);

para

double maTickCerto = NormalizeDouble(MathRound(maCerto/ticksize)*ticksize,_Digits);
 
Rogerio Giannetti Torres:

Olá, vou dar duas sugestões.

1) Coloque a definição dos manipuladores e o ArraySetAsSeries no OnInit()..., pois só é necessário defini-los uma vez !


2) Altere o código.

Eu fiz isso, mas não deu certo, mesmo assim muito obrigado. Eu estou refazendo o código. Nesse trecho ele verifica se o resultado do último trade foi no GAIN ou no LOSS. O problema é que ele fica executando a cada tick. Queria verificar só uma vez isso, tem como?


//VERIFICA SE JÁ ATINGIU A META
      bool trade_money = true;
      if(GAIN_DIARIO > 0 || LOSS_DIARIO > 0)
      {
         datetime end = TimeCurrent();
         datetime start = StringToTime("09:00");
         
         HistorySelect(start,end);
         
         int deals =HistoryDealsTotal();
         
         int returns = 0;
         double profit = 0;
         double loss = 0;
         
         for(int i=0; i<deals; i++)
         {
            ulong deal_ticket = HistoryDealGetTicket(i);
            if(deal_ticket>0)
            {
               string symbol             =HistoryDealGetString(deal_ticket,DEAL_SYMBOL);
               datetime time             =HistoryDealGetInteger(deal_ticket,DEAL_TIME);
               ulong order               =HistoryDealGetInteger(deal_ticket,DEAL_ORDER);
               long order_magic          =HistoryDealGetInteger(deal_ticket,DEAL_MAGIC);
               long pos_ID               =HistoryDealGetInteger(deal_ticket,DEAL_POSITION_ID);
               ENUM_DEAL_ENTRY entry_type=(ENUM_DEAL_ENTRY)HistoryDealGetInteger(deal_ticket,DEAL_ENTRY);
               
               if(order_magic == MagicNumber)
                  {
                     //printf("Magic number ok");
                  }
               if(entry_type == DEAL_ENTRY_OUT)
               {
                  returns++;
                  double results = HistoryDealGetDouble(deal_ticket,DEAL_PROFIT);
                  
                  if(results>0) profit+=results;
                     if(profit >= (GAIN_DIARIO+(loss*-1)))
                     {
                        texto="DESATIVADO. Meta atingida!!!";
                        trade_money = false;
                     }
                  if(results<0) loss+=results;
                     if((loss+profit) <= (LOSS_DIARIO*-1))
                     {
                        texto="DESATIVADO. Stop atingido!!!";
                        trade_money = false;
                     }
               }
            }
            else
            {
               PrintFormat("We couldn't select a deal, with the index %d. Error %d",
                           i,GetLastError());
            }
         }
         /*PrintFormat("The total number of %d deals with a financial result. Profit=%.2f , Loss= %.2f",
                     returns,profit,loss);*/
      }
      //VERIFICA SE JÁ ATINGIU A META
 
northedan:

Eu fiz isso, mas não deu certo, mesmo assim muito obrigado. Eu estou refazendo o código. Nesse trecho ele verifica se o resultado do último trade foi no GAIN ou no LOSS. O problema é que ele fica executando a cada tick. Queria verificar só uma vez isso, tem como?


Olá, acredito que pode lhe ajudar este artigo. Troque o ontick pelo OnTradeTransaction.

https://www.mql5.com/pt/docs/event_handlers/ontradetransaction

Documentação sobre MQL5: Manipulação de eventos / OnTradeTransaction
Documentação sobre MQL5: Manipulação de eventos / OnTradeTransaction
  • www.mql5.com
É chamada em EAs quando ocorre o evento TradeTransaction. A função é projetada para processar os resultados de execução da solicitação de negociação. [in]  Variável do tipo MqlTradeTransaction com descrição da transação feita na conta de negociação. [in]  Variável do tipo MqlTradeRequest com descrição da solicitação que gerou a transação...
 
Cid Ougaske:

Olá, acredito que pode lhe ajudar este artigo. Troque o ontick pelo OnTradeTransaction.

https://www.mql5.com/pt/docs/event_handlers/ontradetransaction

Consegui resolver...obrigado.

Razão: