エキスパート: エキスパート一目(均衡表) - ページ 2

 
Vladimir Karputov #:

コードデバッグを有効にし、ステップバイステップでテストします。

ご回答ありがとうございます。

デバッグを行い、高スプレッドによる誤ったSLがこの問題を引き起こしていることがわかりました。

 
amin ghanbari # :

ご回答ありがとう。

デバッグをしてみたところ、高スプレッドによる誤ったSLがこの問題を引き起こしていることがわかりました。

Expert Advisor内のコードは正しいのですが、ポジションを置いた瞬間に価格が強く動いた場合、ポジションはオープンされません。

 
Vladimir Karputov #:

Expert Advisor内のコードは正しいのですが、ポジションを置いた瞬間に価格が強く動いた場合、ポジションはオープンされません。

この部分はcrypo用に修正すべきだと思います:


//--- 3桁または5桁のチューニング
   int digits_adjust=1;
   if(m_symbol.Digits()==3 || m_symbol.Digits()==5)
      digits_adjust=10;
   m_adjusted_point=m_symbol.Point()*digits_adjust;

   ExtStopLoss    = InpStopLoss     * m_adjusted_point;
   ExtTakeProfit  = InpTakeProfit   * m_adjusted_point;
   ExtTrailingStop= InpTrailingStop * m_adjusted_point;
   ExtTrailingStep= InpTrailingStep * m_adjusted_point;


ロットの決定にRISKを使用するとgetpointerエラーが表示され、fix LOTを使用しなければならない:

//+------------------------------------------------------------------+
//| フリー・マージンからの取引に対するロットまたはリスクのパーセンテージ。
//+------------------------------------------------------------------+
bool LotsOrRisk(const double lots,const double risk,const int digits_adjust)
  {
   if(lots<0.0 && risk<0.0)
     {
      Print(__FUNCTION__,", ERROR: Parameter (\"lots\" or \"risk\") can't be less than zero");
      return(false);
     }
   if(lots==0.0 && risk==0.0)
     {
      Print(__FUNCTION__,", ERROR: Trade is impossible: You have set \"lots\" == 0.0 and \"risk\" == 0.0");
      return(false);
     }
   if(lots>0.0 && risk>0.0)
     {
      Print(__FUNCTION__,", ERROR: Trade is impossible: You have set \"lots\" > 0.0 and \"risk\" > 0.0");
      return(false);
     }
   if(lots>0.0)
     {
      string err_text="";
      if(!CheckVolumeValue(lots,err_text))
        {
         Print(__FUNCTION__,", ERROR: ",err_text);
         return(false);
        }
     }
   else
      if(risk>0.0)
        {
         if(m_money!=NULL)
            delete m_money;
         m_money=new CMoneyFixedMargin;
         if(m_money!=NULL)
           {
            if(!m_money.Init(GetPointer(m_symbol),Period(),m_symbol.Point()*digits_adjust))
               return(false);
            m_money.Percent(risk);
           }
         else
           {
            Print(__FUNCTION__,", ERROR: Object CMoneyFixedMargin is NULL");
            return(false);
           }
        }
//---
   return(true);
  }
//+------------------------------------------------------------------+
 
amin ghanbari # :

***

RISKを使ってロットを決定すると、getpointerエラーが表示され、fix LOTを使わなければなりません:

あなたは自分の間違いに気づきました。

 

注意:スプレッドの大きい商品を使用する場合は、適切なストップロスを 設定する必要があります。

常に覚えておいてください:アスクとビッドです。

 
Vladimir Karputov #:

あなたは自分のミスに気づいた。

ご回答ありがとうございます。エキスパートではすべて正しいのですが、問題は残高不足とスプレッドの抱き合わせによる誤ったSL です。

レバレッジを100に設定しました。このようなエラーが表示されます:

OpenBuy, ERROR: メソッド CheckOpenLong

OpenSell, ERROR: メソッド CheckOpenShort

これは、BTCの最小ロットサイズでポジションを建てるには、この残高では不十分だということですか?

それは本当ですか?

 
amin ghanbari # :

ご回答ありがとうございます。エキスパートではすべてのことが正しいのですが、問題は残高 不足と ハグ・スプレッドによる誤ったSLによる ものです。

私は500$の残高に1%のリスクを設定し、レバレッジを100に設定しました:

OpenBuy, ERROR: メソッド CheckOpenLong

OpenSell, ERROR: メソッド CheckOpenShort

この残高は、BTCの最小ロットサイズでポジションを建てるのに十分ではないということですか?

それは本当ですか?

あなたは間違いを発見しました。どうすれば間違いを正せるか考えてみてください。

 

こんにちは、ウラジミール

専門家を教えていただきありがとうございます。バーのクローズが雲を通過したときにポジションを閉じる条件を追加しようとしています。


 
Mahmoud Ahmed Mahmoud Fahmy # :

こんにちは、ウラジーミル

専門家を教えていただきありがとうございます。バーのクローズが雲を通過したときにポジションを閉じる条件を追加しようとしています。


コードを正しく挿入してください。まず、 コード ボタンを押し、次にポップアップウィンドウにコードを貼り付けて ください。

 
Vladimir Karputov #:

最初に ボタンを 押し 、次にポップアップウィンドウにコードを貼り付けて ください。

こんにちは。

前回の投稿から少しコードを変更したのですが、まだポジションが閉じません。

   double Kij2=iIchimokuGet(KIJUNSEN_LINE,3);
   double SpanA2=iIchimokuGet(SENKOUSPANA_LINE,3);
   double SpanB2=iIchimokuGet(SENKOUSPANB_LINE,3);
   double Chinkou2=iIchimokuGet(CHIKOUSPAN_LINE,3);
   
   
   //クロージング・オーダー
   
  
   
   
  // m_trade.PositionClose(m_symbol.Name());
   //注文を買う
  // {
      
     // if (PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY )
     // {
        // if(iClose(_Symbol,Period(),1) < SpanB)
       // {
            //m_trade.PositionClose(_Symbol);
          //  }
            
     // } 
     // }
      
      //売り注文
      
     // if(PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_SELL)
     // {
         
       // if(iClose(_Symbol,Period(),1) > SpanB)
        // {
         // m_trade.PositionClose(_Symbol);
         //}
      // }
            
          // if(m_trade.ResultRetcode()==10008 || m_trade.ResultRetcode()==10009)//リクエスト完了または注文発注
             // {
             // Print("終了ルール:チケット#:",m_trade.ResultOrder())で決済注文が発注されました;
             //  }
            //それ以外
              // {
              // Print("Exit rules:決済注文の要求を完了できませんでした:",GetLastError());
             // ResetLastError();
               //を返す;
              // }
            
        // }
    //  }
  // }
   
   
//--- チェックBUY
      if (iClose(_Symbol,PERIOD_D1,1) < iClose(_Symbol,PERIOD_D1,2) && iHigh(_Symbol,PERIOD_H4,2) - iLow(_Symbol,PERIOD_H4,2) > iHigh(_Symbol,PERIOD_H4,1)- iLow(_Symbol,PERIOD_H4,2) )
      {  

      if (iOpen(m_symbol.Name(),Period(),0) > Kij && iOpen(m_symbol.Name(),Period(),0) > SpanA)
  // if(Ten1<=Kij1 && Ten>Kij &&)
   //&& m_symbol.Ask()>SpanA1 
   //&& m_symbol.Ask()>SpanB1&&。 
     // iOpen(m_symbol.Name(),Period(),1)<iClose(m_symbol.Name(),Period(),1))//||。 
      //(Chinkou1<=iClose(m_symbol.Name(),Period(),11) && Chinkou>iClose(m_symbol.Name(),Period(),10)&&。 
     // m_symbol.Ask()>SpanA1 && m_symbol.Ask()>SpanB1 && . 
     // iOpen(m_symbol.Name(),Period(),1)<iClose(m_symbol.Name(),Period(),1))。
     {
      double sl=(InpStopLoss==0)?0.0:m_symbol.Ask()-ExtStopLoss;
      if(sl>=m_symbol.Bid()) // インシデント:ポジションはまだオープンされておらず、すでにクローズされていなければならない。
        {
         PrevBars=0;
         return;
        }
      double tp=(InpTakeProfit==0)?0.0:m_symbol.Ask()+ExtTakeProfit;
           if(iClose(_Symbol,Period(),1) < SpanB)
   {
      if(m_position.Select(_Symbol))                     //このシンボルの位置がすでに存在する場合
        {
         if(m_position.PositionType()==POSITION_TYPE_BUY) m_trade.PositionClose(_Symbol);   //これが買いポジションなら、決済する。
        // if(m_Position.PositionType()==POSITION_TYPE_SELL) return;
         }
   }
      
      OpenBuy(sl,tp);
     }
     }
     
//--- 売りチェック
         
     if (iClose(_Symbol,PERIOD_D1,1) > iClose(_Symbol,PERIOD_D1,2) && iHigh(_Symbol,PERIOD_D1,2) - iLow(_Symbol,PERIOD_H4,2) > iHigh(_Symbol,PERIOD_H4,1)- iLow(_Symbol,PERIOD_H4,2) )
      {
 
      if(iOpen(m_symbol.Name(),Period(),0) < Kij && iOpen(m_symbol.Name(),Period(),0) < SpanB)
        
         
        
  // if(Ten1>Kij1 && Ten<Kij &&)
   //&& m_symbol.Bid()<SpanA1 && m_symbol.Bid()<SpanB1 && ... 
     // iOpen(m_symbol.Name(),Period(),1)>iClose(m_symbol.Name(),Period(),1))//||。 
      //(Chinkou1>=iOpen(m_symbol.Name(),Period(),11) && Chinkou<iOpen(m_symbol.Name(),Period(),10) && 
      //m_symbol.Bid()<SpanA1 && m_symbol.Bid()<SpanB1 && 。 
      //iOpen(m_symbol.Name(),Period(),1)>iClose(m_symbol.Name(),Period(),1)))。
     {
      double sl=(InpStopLoss==0)?0.0:m_symbol.Bid()+ExtStopLoss;
      if(sl<=m_symbol.Ask()) // インシデント:ポジションはまだオープンされておらず、すでにクローズされていなければならない。
        {
         PrevBars=0;
         return;
        }
      double tp=(InpTakeProfit==0)?0.0:m_symbol.Bid()-ExtTakeProfit;
      
         if(iClose(_Symbol,Period(),1) > SpanB)
         {
            if(m_position.Select(_Symbol))                     //このシンボルの位置がすでに存在する場合
            {
               if(m_position.PositionType()==POSITION_TYPE_SELL) m_trade.PositionClose(_Symbol);   //これが買いポジションなら、決済する。
        // if(m_Position.PositionType()==POSITION_TYPE_SELL) return;
            }
         }
      
      OpenSell(sl,tp);
     }
    } 
    // m_trade.PositionClose(_Symbol);
  }