初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 1322

 
こんにちは、同じタイプのインジケータバッファが たくさんあり、ループ内で計算することができますが、インジケータバッファの配列を作るにはどうすればよいですか?構造体を通して試したところ、すべてうまくいき、SetIndexBuffer()もエラーなく動作しましたが、OnCalculate()が来ると配列のサイズが変化せず、0のままになっています。ループ内のインジケータバッファの計算を整理する方法を教えてください。おそらく、次のような名前で: "buff_0","buff_1", etc., but how to do this I don't know(( さもなければ、それは非常に長いシートが出ます(
 
SanAlex:

それが功を奏したということでしょうか。

ありがとうございます。

全て正しいのですが、私が考えていた のとはちょっと違います!!注文はトレンドに沿って(インジケータに従って)置かれ、それがクローズするとすぐに同じ方向(トレンドに沿って)に新しい注文が開かれます。

2つ目は、トレンドが反転したとき(インジケータが価格方向転換のシグナルを出したとき)に武井が決済しなかった 注文は、決済してはいけないということです(あなたが 決済してしまったということです)。

つまり、2つのパーツが対になって機能することが大切なのです。

 
Alexey Viktorov:

昨日、この奇跡を見ようと思ってダウンロードしたのですが・・・突然、インターネットが使えなくなりました。雷雨の後、一日中テクニカルワークがあった。そこで、暇つぶしにMQL5で書き直して、ここに 公開することにしました。

どんな雲にも銀の裏地があるということですね......。

ありがとうございました。

私のアイデアが実現したら、便利かもしれませんね。

 
VANDER:
ページを通して試したところ、問題なく動作したようです

そういうものなのでは?

int size=100;

struct All
   {
   double buff[];
   } all[];

int OnInit()
   {
   IndicatorBuffers(size);
   ArrayResize(all,size);
   for(int i=0; i<size; i++)
      {
      SetIndexBuffer(i,all[i].buff);
      SetIndexStyle(i,DRAW_LINE);
      }
   return(INIT_SUCCEEDED);
   }

int OnCalculate(const int rates_total,
                const int prev_calculated,
                const datetime &time[],
                const double &open[],
                const double &high[],
                const double &low[],
                const double &close[],
                const long &tick_volume[],
                const long &volume[],
                const int &spread[])
   {
   for(int i=0; i<size; i++)
      {
      all[i].buff[shift]=i;
      }
   return(rates_total);
   }
 

Sprut 185:

ここで、マーチンゲールを適用する必要があります。つまり、一定のステップ、倍率で非トレンドの注文を開き、平均を取ることです。

要するに、2つのパーツが対になって動くことが大切なのです。

次のポジションはダブルロットで2-4-8-16をBUYで、反対の2-4-8-16をSELLで建てるべきということですか?

そんな機能を、なんとなく自作してみました。

//+------------------------------------------------------------------+
//| ENUM_LOT_RISK                                                    |
//+------------------------------------------------------------------+
enum LotMax
  {
   Lot=0,   // Lots
   Lotx2=1, // Lots*2
   Risk=2,  // Risk
  };
//+------------------------------------------------------------------+
input LotMax InpLotRisk              = Risk;         // : Lots,- Lots*2,- Risk
input double MaximumRisk             = 0.02;         // : Maximum Risk in percentage
input double DecreaseFactor          = 3;            // : Descrease factor
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double TradeSizeOptimized(void)
  {
   double price=0.0;
   double margin=0.0;
//--- select lot size
   if(!SymbolInfoDouble(_Symbol,SYMBOL_ASK,price))
      return(0.0);
   if(!OrderCalcMargin(ORDER_TYPE_BUY,_Symbol,1.0,price,margin))
      return(0.0);
   if(margin<=0.0)
      return(0.0);
   double lot=NormalizeDouble(AccountInfoDouble(ACCOUNT_MARGIN_FREE)*MaximumRisk/margin,2);
//--- calculate number of losses orders without a break
   if(DecreaseFactor>0)
     {
      //--- select history for access
      HistorySelect(0,TimeCurrent());
      //---
      int    orders=HistoryDealsTotal();  // total history deals
      int    losses=0;                    // number of losses orders without a break
      for(int i=orders-1; i>=0; i--)
        {
         ulong ticket=HistoryDealGetTicket(i);
         if(ticket==0)
           {
            Print("HistoryDealGetTicket failed, no trade history");
            break;
           }
         //--- check symbol
         if(HistoryDealGetString(ticket,DEAL_SYMBOL)!=_Symbol)
            continue;
         //--- check Expert Magic number
         if(HistoryDealGetInteger(ticket,DEAL_MAGIC)!=UNO_MAGIC)
            continue;
         //--- check profit
         double profit=HistoryDealGetDouble(ticket,DEAL_PROFIT);
         if(profit>0.0)
            break;
         if(profit<0.0)
            losses++;
        }
      //---
      if(losses>1)
         lot=NormalizeDouble(lot-lot*losses/DecreaseFactor,1);
     }
//--- normalize and check limits
   double stepvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_STEP);
   lot=stepvol*NormalizeDouble(lot/stepvol,0);
   double minvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MIN);
   if(lot<minvol)
      lot=minvol;
   double maxvol=SymbolInfoDouble(_Symbol,SYMBOL_VOLUME_MAX);
   if(lot>maxvol)
      lot=maxvol;
//--- return trading volume
   return(lot);
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double OptimizedBuy(void)
  {
   double PROFIT_BUY=0.00;
   for(int i=PositionsTotal()-1; i>=0; i--) // returns the number of open positions
     {
      string   position_GetSymbol=PositionGetSymbol(i); // GetSymbol позиции
      if(position_GetSymbol==m_symbol.Name())
        {
         if(m_position.PositionType()==POSITION_TYPE_BUY)
           {
            PROFIT_BUY=PROFIT_BUY+m_position.Select(Symbol());
           }
        }
     }
   double Lots=MaximumRisk;
   double ab=PROFIT_BUY;
   switch(InpLotRisk)
     {
      case Lot:
         Lots=MaximumRisk;
         break;
      case Lotx2:
         if(ab>0 && ab<=1)
            Lots=MaximumRisk*2;
         if(ab>1 && ab<=2)
            Lots=MaximumRisk*4;
         if(ab>2 && ab<=3)
            Lots=MaximumRisk*8;
         if(ab>3)
            Lots=TradeSizeOptimized();
         break;
      case Risk:
         Lots=TradeSizeOptimized();
         break;
     }
   return(Lots);
  }
//+------------------------------------------------------------------+
//| Calculate optimal lot size                                       |
//+------------------------------------------------------------------+
double OptimizedSell(void)
  {
   double PROFIT_SELL=0.00;
   for(int i=PositionsTotal()-1; i>=0; i--) // returns the number of open positions
     {
      string   position_GetSymbol=PositionGetSymbol(i); // GetSymbol позиции
      if(position_GetSymbol==m_symbol.Name())
        {
         if(m_position.PositionType()==POSITION_TYPE_SELL)
           {
            PROFIT_SELL=PROFIT_SELL+m_position.Select(Symbol());
           }
        }
     }
   double Lots=MaximumRisk;
   double ab=PROFIT_SELL;
   switch(InpLotRisk)
     {
      case Lot:
         Lots=MaximumRisk;
         break;
      case Lotx2:
         if(ab>0 && ab<=1)
            Lots=MaximumRisk*2;
         if(ab>1 && ab<=2)
            Lots=MaximumRisk*4;
         if(ab>2 && ab<=3)
            Lots=MaximumRisk*8;
         if(ab>3)
            Lots=TradeSizeOptimized();
         break;
      case Risk:
         Lots=TradeSizeOptimized();
         break;
     }
   return(Lots);
  }
//+------------------------------------------------------------------+

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

ポジションの開始で 置き換える必要があります - ここでは、InpLotsの代わりにOptimizedBuy()とOptimizedSell()を使用します。

      if(m_trade.PositionOpen(Symbol(),ORDER_TYPE_BUY,OptimizedBuy(),price,0.0,0.0))
      if(m_trade.PositionOpen(Symbol(),ORDER_TYPE_SELL,OptimizedSell(),price,0.0,0.0))
 
SanAlex:

次のポジションはダブルロットで2-4-8-16をBUYで、反対の2-4-8-16をSELLで建てるということでしょうか?

そんな機能を、なんとなく自作してみました。

\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\

ポジションオープン 時に置き換える必要があります。ここでは、InpLotsの代わりにOptimizedBuy()とOptimizedSell()を使用します。

が、この機能については、あった方が良いですね~利益で決済される(通貨で)

input double InpTProfit              = 40000;        // : Take Profit --> (In currency the amount)
input double InpSLoss                = 1000000;      // : Stop Loss --> (In currency the amount)
//+------------------------------------------------------------------+
//| ProfitOnTick closing                                             |
//+------------------------------------------------------------------+
void ProfitOnTick(void)
  {
//---
   double PROFIT_BUY=0.00;
   double PROFIT_SELL=0.00;
   int total=PositionsTotal();
   for(int i=total-1; i>=0; i--)
     {
      string   position_GetSymbol=PositionGetSymbol(i);
      if(position_GetSymbol==m_symbol.Name())
        {
         if(m_position.PositionType()==POSITION_TYPE_BUY)
           {
            PROFIT_BUY=PROFIT_BUY+PositionGetDouble(POSITION_PROFIT);
           }
         else
           {
            PROFIT_SELL=PROFIT_SELL+PositionGetDouble(POSITION_PROFIT);
           }
        }
      if(PROFIT_BUY<-InpSLoss || PROFIT_BUY>=InpTProfit)
        {
         CheckForCloseBuy();
        }
      if(PROFIT_SELL<-InpSLoss || PROFIT_SELL>=InpTProfit)
        {
         CheckForCloseSell();
        }
     }
  }
//+------------------------------------------------------------------+
 
SanAlex:

しかし、この機能には、利益(通貨建て)で閉じる、このような機能があることが望ましいでしょう。

私が作っているEAの 考え方や操作の意味を、もう少しわかりやすく説明しましょう。

あなたは、単純なマーティンを必要とする - 例えばAutoProfit 3、であなただけの注文のオープニングは、指標の信号に基づいていたことを追加する必要がある(トレンドに応じて)ではなく、AutoProfitのように - カードが上に落ちるように......そしてそれはすべてである。

添付ファイルとほぼ同じ出力パラメータで。
ファイル:
pbx0dcw.jpg  201 kb
 
Sprut 185:

私のアイデアと、作られたEAの 仕事の意味を、もう少しわかりやすく説明しましょう。

あなたは、単純なマーティンを必要とする - 例えばAutoProfit 3、その中であなただけの注文のオープニングは、むしろAutoProfitのようにではなく、指標の信号(トレンド)にあったことを追加する必要があります - カードがあるとして......そしてそれはすべてだ......。

つまり、インジケータからのシグナルで開くのですが、反対のシグナルが現れたら、反対方向に開くのです。シグナルが反対側に反転し、そのオープンポジションをクローズした場合、それはあなたに適していません。

 
SanAlex:

もしシグナルが反対方向に向いたら、反対方向にオープンし、そのポジションが利益でクローズしていなければ、利益でクローズするまでそこにぶら下がることになるのです。向こうの信号がひっくり返って、その開いている位置を閉じてしまったら元も子もないでしょう。

そうですね......そして、そのポジションが利益で決済されていなければ、利益で決済されるまでそこに留 まることになります。

しかし、利益で閉じなかったポジション(例えば、買い)は、トレンドが反転するまで、別の注文(買い)が乗じたボリュームと平均時間損失などで開かれる一定のステップまで残って下がるはずですが、トラック内のポジションのオープンが 停止することはありません。

だから、Martinとby indicatorの2ブロックが同時に動くようにと書いたのです。

もし私がうまく説明できなかったことがあれば、Skypeでデモを行い、どのように見えるかをお見せする用意があります。

 
Sprut 185:

すべて正しいです......そして、そのポジションが利益で閉じていない場合、利益で閉じるまでそこに留 まります。

しかし、利益で閉じなかったポジションは(例えば、買いで)残り、ある段階まで下がり、そこで別の注文が(買いで)掛けられたボリュームで開き、平均のタイミングは下がるなど、トレンドが反転するまで、取引のポジションのオープンは 止まらないはずです。

だから、Martinとby indicatorの2ブロックが同時に動くようにと書いたのです。

もし説明が不十分な点があれば、Skypeで実演し、どのように見えるかをお見せする用意があります。

マーチンは、インジケータ信号が反対のときだけ起動しなければならない、またはそれに依存しない?

例)インジケーターに従って買いポジションを建てた。価格が設定された距離だけ下降し、インジケータはすでに売りを示しています。買いポジションを建てるべきでしょうか?

理由: