Мнение - очень успешный советник - $3000 счет до $6300 за две недели (могло бы быть $9000) - страница 5

 

1 быстрая вещь, прежде чем я уйду на работу, есть булевы переменные, которые могут быть истинными или ложными. вам не нужно использовать строку для этого.

Трудно поверить, что вы следуете книге.

 
zzuegg:

1 быстрая вещь, прежде чем я уйду на работу, есть булевы переменные, которые могут быть истинными или ложными. вам не нужно использовать строку для этого.

Трудно поверить, что вы следуете книге.

Я пытаюсь. Я учусь торговать + программировать + MQL одновременно.

Разве вы научитесь водить машину, прочитав одну только книгу?

но спасибо

 
MickGlancy:

Я получаю ошибку, что функция OpenBuyOrder и OpenSellOrder не возвращает результат.

что я делаю не так?

Вы получаете эту ошибку, потому что функции OpenBuyOrder() и OpenSellOrder() фактически не возвращают результат. Вы определили их как void, что означает, что они не возвращают никакого аргумента, но вы пытаетесь вернуть целое число (0).

Вот код с некоторыми комментариями:

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; 
}

Основываясь на вашей функции GetSignal, кажется, что вы хотите использовать OpenBuy/SellOrder(), чтобы просто открыть ордер, а не возвращать какой-либо аргумент. Я немного почистил вашу функцию GetSignal(), добавив некоторые комментарии.

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:

вы получаете эту ошибку, потому что функции OpenBuyOrder() и OpenSellOrder() фактически не возвращают результат. вы определили их как void, что означает, что они не возвращают никакого аргумента, но вы пытаетесь вернуть целое число (0).

Вот код с некоторыми комментариями:

Основываясь на вашей функции GetSignal, кажется, что вы хотите использовать OpenBuy/SellOrder(), чтобы просто открыть ордер, а не возвращать какой-то аргумент. Я немного почистил вашу функцию GetSignal() с некоторыми комментариями.

Это объясняет тонны, спасибо большое, я сейчас пробую.

Мой собственный код немного запутан, потому что я в основном копирую из других советников и пытаюсь заставить его работать.

 
без проблем. не стесняйтесь спрашивать, если столкнетесь с другими проблемами
 
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
:

Нет проблем. Не стесняйтесь спрашивать, если столкнетесь с другими проблемами.

я собрал много примеров трейлинг-стопов, но мне нужен такой, который сразу же начинает трейлинг через -ve значения к 0, а затем останавливается как безубыточный.

Так что если взята цена входа в рынок и стоп-лосс равен 100, при движении цены к +25, трейлинг-стоп перемещается к -75, а затем, когда цена достигает 100, трейлинг-стоп останавливается на 0 и не движется дальше.

Может ли кто-нибудь помочь мне с этим? Я потратил весь день, пытаясь заставить его работать, но не могу.

Я думал, что сделал это, но нет, мой трейлинг-стоп следует через 0.

 

Псевдокод:

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:

если(Buyorder и stoploss < openrice) : мы должны трейлить

разве стоп-лосс не должен быть всегда ниже openprice, и наоборот?

Я планирую в конечном итоге использовать функцию MaxLoss, поэтому я не буду вставлять стоп-лосс в OrderSend.

если Op_Buy

if bid <= OpenOrderPrice()+(значение трейлинг стопа) : trail -- как только bid > TSV, он не должен продолжать движение?

и

если Op_Sell

если ask >= OpenOrderPrice()-(значение трейлинг-стопа): trail ?

Тогда при значении выше, чем Trailingstop, безубыток может завершить работу?

 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:

если(Buyorder и stoploss < openrice) : мы должны трейлить

разве стоп-лосс не должен быть всегда ниже openprice, и наоборот? Нет, только перед безубыточностью

Я не думаю, что ваш код работает, похоже, вы пытаетесь сделать все наоборот...
 
zzuegg:
Я не думаю, что ваш код работает, похоже, вы пытаетесь сделать все наоборот...

нет, все работает отлично. Позвольте мне проверить, что сейчас все так же, как и в том ответе.

Это настолько близко к компромиссу, насколько я могу достичь, чтобы закрыть разрыв убытка за движущейся сделкой, но при этом дать ей возможность дышать. До этого сделка должна была достичь 60 пунктов, прежде чем произойдет BE, поэтому было много максимально остановленных сделок, что приводило к высокой просадке. Надеюсь, это изменит ситуацию.

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();
               }
            }
      }