意見 - 非常に成功したEA - 3000ドルの口座が2週間で6300ドルに(9000ドルになっていたかもしれない)。 - ページ 5

 

仕事に行く前にひとこと、ブーリアン変数には真偽を表すものがあります。

この本の通りにやっているとはとても思えません。

 
zzuegg:

仕事に行く前にひとこと、ブーリアン変数には真偽を表すものがあります。

この本の通りにやっているとはとても思えません。

私はしようとしている。私は同時にトレード+プログラム+ MQLを学んでいます。

あなたは一人で本を読んで車を運転することを学ぶのですか?

でも、ありがとうございます。

 
MickGlancy:

OpenBuyOrder と OpenSellOrder 関数が結果を返さないというエラーが発生します。

私は何を間違えているのでしょうか?

このエラーは、関数 OpenBuyOrder() と OpenSellOrder() が実際には結果を返さない ために発生しています。

以下は、そのコードといくつかのコメントです。

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() が実際には結果を返さない ために発生しています。

以下は、そのコードといくつかのコメントです。

GetSignal関数から、あなたはOpenBuy/SellOrder()を使って、実際に引数を返すのではなく、単に注文を開きたいようですね ... GetSignal() 関数を少し整理し、コメントを付けました。

それはトンを説明します、どうもありがとうございました、私は今それを試しています。

私は基本的に他のEAからコピーして、それを動作させようとしているので、私自身のコードは少し混乱しています。

 
問題ありません。もし、他の問題が発生した場合は、お気軽にお問い合わせください。
 
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でストップロ スが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

if(Buyorder and stoploss < openprice) : トレールする必要がある。

ストップロスは 常にopenpriceより低く、その逆はないのでしょうか?

私は最終的にMaxLoss関数を使うつもりなので、OrderSendでストップロスを入れることはありません。

もし Op_Buy

if bid <= OpenOrderPrice()+(Trailing Stop value) : trail -- 一度 bid > TSV になると動き続けてはいけないのですか?

そして

もしOp_Sell

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

そして、Trailingstopより高い値で、Breakevenは仕事を終えることができます?

 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

if(Buyorder and stoploss < openprice) : トレールする必要がある。

ストップロスは常にオープンプライスより低く、その逆は? いいえ、ブレークイーブンの前だけです。

あなたのコードが動作するとは思えない、あなたは逆のことをしようとしているようだ...
 
zzuegg:
あなたのコードがうまくいくとは思えない。逆をやろうとしているように見える...

いいえ、完全に動作しています。今、そのレスの時と同じかどうか確認 させてください。

これは、動いているトレードの背後で損切りギャップを閉じつつ、息継ぎをさせるという妥協点に限りなく近いものです。これ以前は、BEが起こる前にトレードが60ポイントに達しなければならなかったので、最大でストップアウトしたトレードがたくさんあり、それが私のドローダウンを高くする原因となっていました。

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