Opinião - muito sucesso EA - conta de $3000 a $6300 em duas semanas (poderia ter sido $9000) - página 5

 

1 coisa rápida antes de eu ir trabalhar, há variáveis booleanas que podem ser verdadeiras ou falsas. você não precisa usar um fio para isso.

Dificilmente acredito que você esteja seguindo o livro

 
zzuegg:

1 coisa rápida antes de eu ir trabalhar, há variáveis booleanas que podem ser verdadeiras ou falsas. você não precisa usar um fio para isso.

Dificilmente acredito que você esteja seguindo o livro

Eu estou tentando. Estou aprendendo a negociar + programa + MQL ao mesmo tempo.

Você aprende a dirigir um carro lendo o livro sozinho?

mas obrigado

 
MickGlancy:

Estou recebendo o erro de que a função OpenBuyOrder e OpenSellOrder não retorna nenhum resultado

o que estou fazendo de errado ?

você está recebendo este erro porque as funções OpenBuyOrder() & OpenSellOrder() na verdade não retornam um resultado... você as definiu como nulas, significando que elas não retornam nenhum argumento, mas você está tentando retornar um número inteiro (0).

aqui está o código com alguns comentários:

void OpenBuyOrder( double StopLoss, double TakeProfit )
{
         int Ticket;			
         double SL,TP,SLP,TPP,OPP;
         
         if(HideSL==false && StopLoss>0){SL=Ask-StopLoss*Point;}
         else {SL=0;}
         
         if(SL>0 && SL>(Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)){SL=Bid-MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;}
         
         if(HideTP==false && TakeProfit>0){TP=Ask+TakeProfit*Point;}
         else {TP=0;}
         
         Ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,Slippage,SL,TP,EAName,Magic,0,Blue);	//-- this stores the value for Ticket, but it never gets used.. 
                                                                                        //-- you can simply call OrderSend() without storing the result 

   return;    //--- void means the function returns no argument.. thus, no parentheses for return
}

void OpenSellOrder( double StopLoss, double TakeProfit)
{
         int Ticket;
         double SL,TP,SLP,TPP,OPP;
         
         if(HideSL==false && StopLoss>0){SL=Bid+StopLoss*Point;}
         else {SL=0;}
         
         if(SL>0 && SL<(Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point)){SL=Ask+MarketInfo(Symbol(),MODE_STOPLEVEL)*Point;}
         
         if(HideTP==false && TakeProfit>0){TP=Bid-TakeProfit*Point;}
         else {TP=0;/*TPP=0;*/}
         
         Ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,SL,TP,EAName,Magic,0,Red);
         
    return; 
}

baseado em sua função GetSignal, parece que você quer usar OpenBuy/SellOrder() para apenas abrir uma ordem, em vez de realmente retornar algum argumento ... Eu limpei um pouco sua função GetSignal() com alguns comentários

void GetSignal(int MaxBuyOrders, double StopLoss, double TakeProfit) 		//--- Why make this function a bool??
{
   int Op_Buy,Op_Sell,Op_BuyStop,Op_SellStop,Op_BuyLimit,Op_SellLimit;
        
   int total = OrdersTotal();
  
   for(int x=total-1; x>=0; x--)
   {
      OrderSelect(x, SELECT_BY_POS, MODE_TRADES);
      int type   = OrderType();
      bool result = false;    //-- not used anywhere??
      
      if (type==OP_BUY)       Op_Buy++;
      if (type==OP_SELL)      Op_Sell++;
      if (type==OP_BUYSTOP)   Op_BuyStop++;
      if (type==OP_SELLSTOP)  Op_SellStop++;         
   }
  
   int limit=1;		        //--- why define limit to 1 
   for(int i=1;i<=limit;i++)    //--- your for-loop will always run once, in which case why even have a for-loop?
   {
      double MA1=iMA(NULL,0,100,0,1,0,0);
      double MA2=iMA(NULL,0,100,0,1,0,1);
      double MA3=iMA(NULL,0,40,0,1,0,0);
      double MA4=iMA(NULL,0,40,0,1,0,1);
      
      bool BUY=false;   //-- as one guy mentioned better to go with booleans here
      bool SELL=false;

      if(MA1 < MA3 && MA2 > MA4) BUY=true;  
      if(MA1 > MA3 && MA2 < MA4) SELL=true;
      // missed out  && total == 0 for now
      bool SignalBUY=false;
      bool SignalSELL=false;
      
      if(BUY) //-- dont need to write == for bool's ..BUY is same as BUY==true, !BUY same as BUY==false
      if(ReverseSystem) SignalSELL=true;
      else SignalBUY=true;
      
      if(SELL)
      if(ReverseSystem) SignalBUY=true;
      else SignalSELL=true;
      
      if (SignalBUY && Op_Buy < MaxBuyOrders )   OpenBuyOrder(StopLoss,TakeProfit); 	//--- no need to return the return of OpenBuyOrder().. simply calling it will run the code
      if (SignalSELL && Op_Sell < MaxSellOrders) OpenSellOrder(StopLoss,TakeProfit);	//-- same
   }
   return;
}
 
supertrade:

você está recebendo este erro porque as funções OpenBuyOrder() & OpenSellOrder() na verdade não retornam um resultado... você as definiu como nulas, significando que elas não retornam nenhum argumento, mas você está tentando retornar um número inteiro (0).

aqui está o código com alguns comentários:

baseado em sua função GetSignal, parece que você quer usar OpenBuy/SellOrder() para apenas abrir uma ordem, em vez de realmente retornar algum argumento ... Eu limpei um pouco sua função GetSignal() com alguns comentários

Isso explica as toneladas, muito obrigado, estou tentando agora

meu próprio código está um pouco confuso porque estou basicamente copiando de outros EAs e tentando fazê-lo funcionar.

 
não há problema... sinta-se à vontade para perguntar se você se deparar com outros problemas
 
void MoveTrailingStop()
{
   int cnt,total=OrdersTotal();
   for(cnt=0;cnt<total;cnt++)
   {
      OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES);
      if(OrderType()<=OP_SELL  &&  OrderSymbol()==Symbol() ) //&&  OrderMagicNumber()==Magic
      {
         if(OrderType()==OP_BUY)
         {
            if(TrailingStop>0)  
            {                 
               if((NormalizeDouble(OrderStopLoss(),Digits)<NormalizeDouble(Bid-Point*(TrailingStop+TrailingStep),Digits)) || (OrderStopLoss()==0))
               {
                  OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Bid-Point*TrailingStop,Digits),OrderTakeProfit(),0,Blue);
                  return(0);
               }
            }
         }
         else 
         {
            if(TrailingStop>0)  
            {                 
               if((NormalizeDouble(OrderStopLoss(),Digits)>(NormalizeDouble(Ask+Point*(TrailingStop+TrailingStep),Digits)))||(OrderStopLoss()==0))
               {
                  OrderModify(OrderTicket(),OrderOpenPrice(),NormalizeDouble(Ask+Point*TrailingStop,Digits),OrderTakeProfit(),0,Red);
                  return(0);
               }
            }
         }
      }
   }
}
supertrade
:

não há problema... fique à vontade para perguntar se você se deparar com outros problemas

colecionei muitos exemplos de trailing stops, mas preciso de um que comece a trilhar imediatamente através dos -ve valores a 0, e depois pare como um break even.

Assim, se o preço de entrada no mercado for tomado e o stop loss for 100, o preço se move para +25, o trailing stop se move para -75, e então uma vez que o preço atinge 100, o trailing stop pára em 0 e não se move mais.

Alguém poderia me ajudar com isto? Eu passei o dia inteiro tentando fazer com que ele funcionasse e não consigo.

Pensei que tinha feito isso, mas não o fiz, minha parada de trilha segue em 0.

 

Código Pseudo:

OrderSelect()

if (Buyorder and stoploss < openrice) : we need to trail
if (Sellorder and stoploss > openprice): we need to trail
if (we need to trail):
Modify Stoploss to Currentprice (+ or -) original stoploss
 

zzuegg:

se(Buyorder and stoploss < openrice) : precisamos de rastrear

não parariam as perdas sempre abaixo do preço aberto, e vice versa ?

Eu pretendo eventualmente usar uma função MaxLoss, por isso não vou colocar um stop loss com o OrderSend.

se o Op_Buy

if bid <= OpenOrderPrice()+(Trailing stop value) : trail -- uma vez licitado > TSV ele não deve continuar a se mover ?

e

se Op_Sell

if ask >= OpenOrderPrice()-(Trailing stop value): trail ?

Então, a um valor superior ao Trailingstop, o Breakeven pode terminar o trabalho ?

 OrderSelect(SELECT_BY_POS,MODE_TRADES);
   if(TrailingStop>0)
      {
      if(OrderType()==OP_BUY)
            {
            if ( Bid <= (OrderOpenPrice()+Point*TrailingStop)  )
               {
                  MoveTrailingStop();
               }
            }
      if(OrderType()==OP_SELL)
            {   
            if ( Ask >= (OrderOpenPrice()-Point*TrailingStop) )
               {
                  MoveTrailingStop();
               }
            }
      }
BTW thanks zzuegg, thats another order management milestone achieved. What can happen with a little help. I am gratefull.
 
MickGlancy:

zzuegg:

se(Buyorder and stoploss < openrice) : precisamos de rastrear

não parariam as perdas sempre abaixo do preço aberto, e vice versa ? Não, somente antes do ponto de equilíbrio

Não acho que seu código funcione, parece que você tenta fazer o contrário...
 
zzuegg:
Não acho que seu código funcione, parece que você tenta fazer o oposto...

não, ele está funcionando perfeitamente. Deixe-me verificar se é o mesmo agora como naquela resposta.

é o mais perto que posso chegar de um compromisso de fechar a lacuna de perdas por trás de um comércio em movimento, mas ainda dando-lhe espaço para respirar. Antes disso, o comércio tinha que atingir 60 pontos antes que BE acontecesse, então havia muito máximo de trocas paradas, o que fez com que meu saque fosse alto. espero que isto altere isso.

OrderSelect(SELECT_BY_POS,MODE_TRADES);
   if(TrailingStop>0)
      {
      if(OrderType()==OP_BUY)
            {
            if ( Bid <= (OrderOpenPrice()+Point*TrailingStop)  )
               {
                  MoveTrailingStop();
               }
            }
      if(OrderType()==OP_SELL)
            {   
            if ( Ask >= (OrderOpenPrice()-Point*TrailingStop) )
               {
                  MoveTrailingStop();
               }
            }
      }