"ダミー "からの質問 - ページ 53

 
無条件で愚かな(無知からの)指標の再作成を、知的な(稀で必要な)指標の作成 と混同しないでください。前者では100倍のブレーキと資源の漏れが発生し、後者では完璧なパフォーマンスが得られます。
 
Renat:
無条件で愚かな(無知からの)指標の再作成を、知的な(稀で必要な)指標の作成 と混同しないでください。前者では百害あって一利なし、後者では完璧な仕事ができる。

カールソンが 無知なために過ちを犯したことは十分承知していますし、その過ちの内容も理解しています。

しかし、彼の問題を解決するための合理的なスキームを提案する。インジケータに記述されたコードを使用する必要がありますが、このコードのパラメータは、インジケータデータにアクセスする前に動的に決定されるのでしょうか?

私は解決策を持っています、それはdllを含んでいますが、あなたは純粋なmqlを使用したいので、mqlの解決策を提供してください。

HZ OnCalculate()とイベントでの計算については既に述べましたが、イベント経由で3つのパラメータを渡すことができます。私のソリューションでは、long dllはパラメータで配列のアドレスを渡すことができ、インジケータはこのアドレスでデータを受け取ります。

mqlのソリューションがあれば、指をさすだけです。

 
Urain:

カールソンが 無知なために過ちを犯したことは十分承知していますし、その過ちの内容も理解しています。

しかし、彼の問題を解決するための合理的なスキームを提案する。インジケータに書かれたコードを使用する必要がありますが、このコードのパラメータは、インジケータ・データを参照する前に動的に決定されるのでしょうか?

現実には何種類の指標を作ればいいのか?おそらく10個以内でないと、無意味な資源の浪費になります。

パラメータの変更がないため、インジケータのコレクションを作成しておけば、必要なときに必要なものが追加されます。もし、指標が10個以下で、明確な意味(初期、確認、修正など)がある場合は、必要なパラメータでハンドルの名前付き変数を作成することができます。

 
Urain:

しかし、彼の問題を解決するための合理的なスキームを提案する。インジケータに書かれたコードを使用する必要がありますが、このコードのパラメータは、インジケータ・データを参照する前に動的に決定されるのでしょうか?

少し考えてみました。コードパラメータを指標データの呼び出し毎に動的に決定するのであれば、その決定手順も指標コードに含めてはどうでしょうか。つまり、すべての計算をインジケータに実装する必要があります。

それとも、そのようなアプローチが原理的に不可能な場合があるのでしょうか?

 
このようなシンプルなインジケーターで、なぜゼロバー(右から1番目)が週足 グラフ以外では 計算されないのか、教えていただけませんか?

#include <MovingAverages.mqh>
#property indicator_chart_window
#property indicator_buffers 1
#property indicator_plots   1
#property indicator_color1 LightBlue
#property indicator_type1   DRAW_LINE
#property indicator_width1 2

input int PERIOD = 80;
input ENUM_MA_METHOD  method = MODE_SMA;
input ENUM_APPLIED_PRICE PRICE = PRICE_CLOSE;
double Uptrend[];
double ExtRsiArray_TF2[];
double mabuf[];
int handleMA,handleMA2;

int OnInit()
  {
   SetIndexBuffer(0, Uptrend);
   PlotIndexSetDouble(0,PLOT_EMPTY_VALUE,0);  
   ArraySetAsSeries(Uptrend,true);
   handleMA=iMA(NULL, 0, PERIOD, 0, method, PRICE);
   handleMA2=iMA(NULL, 0, PERIOD/2, 0, method, PRICE);
   return(0);
  }
  
double WMA(int ai_0,int a_period_4) {
int some;
if(a_period_4==PERIOD)
 if(CopyBuffer(handleMA,0,ai_0,1,ExtRsiArray_TF2)<=0)
  {Alert("Error",GetLastError());
   return(0);
  }
some=PERIOD/2;
if(a_period_4==some)
 if(CopyBuffer(handleMA2,0,ai_0,1,ExtRsiArray_TF2)<=0)
  {Alert("Error",GetLastError());
   return(0);
  }
return (ExtRsiArray_TF2[0]);
}

int OnCalculate (const int rates_total,      
                 const int prev_calculated, 
                 const int begin,          
                 const double& price[] 
   )
  { ArraySetAsSeries(price,true);
    int counted_bars = prev_calculated; 
    if(counted_bars < 0) return(-1); 
    int x = 0; 
    int p = MathSqrt(PERIOD);              
    int e = rates_total - counted_bars + PERIOD + 1; 
    double vect[], trend[]; 
    if(e > rates_total) e = rates_total;    
    ArrayResize(vect, e); 
    ArraySetAsSeries(vect, true);
    ArrayResize(trend, e); 
    ArraySetAsSeries(trend, true);
    ArrayResize(mabuf, e); 
    ArraySetAsSeries(mabuf, true);
    for(x = 0; x < e; x++)        vect[x] = 2*WMA(x, PERIOD/2) - WMA(x, PERIOD);
    if(method==MODE_SMA)
    SimpleMAOnBuffer(e,prev_calculated,PERIOD+1,p,vect,mabuf);

    for(x = 0; x < e-PERIOD; x++) Uptrend[x] = mabuf[x];
    return(rates_total);                
  }
 
Yedelkin:

前々から思っていたんです。指標データを使用する前にコードパラメータを動的に決定するのであれば、その決定手順を指標コードに含めてはどうでしょうか。つまり、すべての計算をインジケータに実装する必要があります。

それとも、そのようなアプローチが原理的に不可能な場合があるのでしょうか?

他の指標で計算されたパラメータをExpert Advisorに返し、Expert Advisorがニューロニックに基づいてどのモデルを使用するかを決定する場合があります。どのようなパラメータが適用されるかは、事前にはわからない。

 
Expert:
このようなシンプルなインジケータにおいて、週足 グラフ以外の すべての場所でゼロ(右から1番目)のバーが計算されないのはなぜか、教えていただけませんか?


おっと)私はここに置いた:SimpleMAOnBuffer(e,prev_calculated,PERIOD+1,p,vect,mabuf); instead of e - rates_total and everything works)
 
Expert:
おっと、ここでSimpleMAOnBuffer(e,prev_calculated,PERIOD+1,p,vect,mabuf);の代わりにe - rates_totalで全てうまくいきました) を置換した。)

Expertという ニックネームのバグマンを修正しました。
 

多通貨のExpert Advisorを構築しようとしています。今のところ、Nikolay Kositsin氏の記事「Creating Expert Advisor that trades on different symbols」で提案されている方式に決定しています。同じパラメータで異なるシンボルを使用してテストを実行すると、結果が異なるという問題に直面しました。フォーラムをスクロールしてみると、多くの人がOnTimer() 関数を使うことでこの問題を解決できるという結論に達していることがわかりました。Andrey Khatimlanskyがここで アドバイスしてくれました。

Отвяжитесь от тиков конкретного инструмента (OnTick) - это же мультивалютник! Работайте по таймеру или ловите момент образования бара на всех рабочих инструментах, это будет надежнее.

すべての楽器でバー形成の瞬間をとらえようとしたが、思うようにいかなかった。

例えば、こんな感じです。

新しいバーを検出するための関数では、機器とタイムフレームを明示的に指定しています。

bool isNewBar(string Symbol_, ENUM_TIMEFRAMES Timeframe)
{
 // В статической переменной будем помнить время открытия последнего бара
 static datetime last_time = 0;
 // Текущее время
 datetime lastbar_time = (ENUM_SERIES_INFO_INTEGER)SeriesInfoInteger(Symbol_,Timeframe,SERIES_LASTBAR_DATE);

 // Если это первый вызов функции
 if(last_time == 0)
   {
    // Установим время и выйдем 
    last_time = lastbar_time;
    return(false);
   }

 // Если время отличается
 if(last_time != lastbar_time)
   {
    // Запомним время и вернем true
    last_time = lastbar_time;
    return(true);
   }
 // Дошли до этого места - значит бар не новый, вернем false
 return(false);
}

OnTick() 関数では、Nikolay Kositsin氏が提案したスキームが採用されています。

例えば、こんな感じです。

void OnTick()
{ 
 // Объявление массивов переменных для торговых сигналов  
 static bool UpSignal[2], DnSignal[2];

 // Получение торговых сигналов
 TradeSignalCounter(0, остальные параметры);
 TradeSignalCounter(1, остальные параметры);

 // Совершение торговых операций
 TradePerformer(0, остальные параметры);
 TradePerformer(1, остальные параметры);
}


isNewBar(Symbol,Timeframe) 関数は、取引が実行される関数、すなわちTradePerformer(parameters) の中で呼び出されます。

例えば、こんな感じです。

bool TradePerformer(параметры)
{

...

 if(isNewBar(Symbol_,Timeframe))
   {
    Trailing_Stop(параметры);
   
    Open_Source_Position(параметры);
   }
 return(true);
}


つまり、新しいバーは各シンボルに対して個別にチェックされます。新しいバーがなければ、次のシンボルをチェックします。そして、それはダニが発生するたびに起こるのです。しかし、このバリエーションはうまくいきません。

マルチカレンシーエキスパートアドバイザーで新しいバーのチェックを与えられたスキームで正しく実装する方法をご教示ください。
 
Urain:
エキスパートと 呼ばれる人の間違いを正すためにユーモアスレッドにすべき?
このフォーラムでは、人種や時間枠に関係なく、エキスパートコードのエラーを修正することができますし、そうすべきです :)