戦略を求める人は?たくさん、しかも無料で)。 - ページ 57

 
Miroslav_Popov >> :

さらに、ドローダウンをパーセントで表示することもできるので、見やすくなりますね。>> ありがとうございました。

 

FSBからMQL4へのコンバーターの始まりとなりえます。

ご意見、ご感想がありましたら、ぜひお寄せください。


//+------------------------------------------------------------------+
//|                   FSB__Bar_Opening - Bar_Closing.mq4 v0.0.1 Beta |
//|                                 Copyright © 2009, Miroslav Popov |
//|                                              http://forexsb.com/ |
//|                                                                  |
//| An exmple EA pattern:                                            |
//| * Enter the market at Bar Opening                                |
//| * Exit the market at Bar Closing                                 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2009, Miroslav Popov"
#property link      "http://forexsb.com/"

// The time span before bar closing time in seconds.
// It determines the time interval for position closing.
extern double ClosingTimeSpan = 10;


int start()
{
   // Check if there are open positions from the previous bar
   int iOrders = OrdersTotal();
   if( iOrders > 0)
      ClosePositionsAtBarClosing(true, true, ClosingTimeSpan);
 
 
   
   // Opening Logic Conditions
   bool bLongEntryAllowed  = false;
   bool bShortEntryAllowed = false;

   // Put the entry logic rules here ...
   
   if(iMA(NULL, 0, 13, 0, MODE_SMA, PRICE_CLOSE, 1) >
      iMA(NULL, 0, 13, 0, MODE_SMA, PRICE_CLOSE, 2))
      bLongEntryAllowed = true;
   else
      bShortEntryAllowed = true;


   // Entry at Bar Opening
   iOrders = OrdersTotal();
   if( iOrders == 0)
   {
      if( bLongEntryAllowed || bShortEntryAllowed)
         OpenPositionAtBarOpening( bLongEntryAllowed, bShortEntryAllowed);
         
      iOrders = OrdersTotal();
      if( iOrders > 0)
         return(0);
   }



   // Exit Logic Conditions
   bool bCloseLong  = true;
   bool bCloseShort = true;

   // Put the exit logic rules here ...
   
   // Exit
   if( bCloseLong || bCloseShort)
      ClosePositionsAtBarClosing( bCloseLong, bCloseShort, ClosingTimeSpan);
}

// Entry at a Bar Opening price.
//
// MetaTrader does not provide an onBarOpen event so we check the current tick volume.
// We open a position when the current tick volume is equal to 1.
void OpenPositionAtBarOpening(bool bLongEntryAllowed, bool bShortEntryAllowed)
{
   if(! bLongEntryAllowed && ! bShortEntryAllowed)
   { // An entry is not allowed.
      return(0);
   } 
   
   // Check for Bar Opening
   if(iVolume(NULL, 0, 0) > 1)
   {  // This is not the first tick.
      return(0);
   } 
   
   int iLots = 1;

   // Check the free margin.
   if(AccountFreeMargin() < (1000 * iLots))
   {
      Print("We do not have money enough! Free Margin = ", AccountFreeMargin());
      return(0);  
   }
      
   int ticket = 0;
   if( bLongEntryAllowed)
   {
      ticket = OrderSend(Symbol(), OP_BUY, iLots, Ask, 3, 0, 0, "Bar Opening", 0 ,0 , Green);
   }
   if( bShortEntryAllowed)
   {
      ticket = OrderSend(Symbol(), OP_SELL, iLots, Bid, 3, 0, 0, "Bar Opening", 0 ,0 , Red);
   }
   
   if( ticket > 0)
   {
      if(OrderSelect( ticket, SELECT_BY_TICKET, MODE_TRADES))
         Print("Position opened at: ", OrderOpenPrice());
   }
   else 
   {
      Print("Error opening a position: ", GetLastError());
   }
      
   return(0);
}


// Exit at a Bar Closing price (almost).
//
// MetaTrader does not provide an onBarClose event so we are not able to close a position
// exactly at Bar Closing. We workaround the problem by closing the position within a time span
// near to the bar closing time. In the cases when there is no any ticks within this period,
// we close the position att he next bar opening price.
void ClosePositionsAtBarClosing(bool bCloseLong, bool bCloseShort, datetime dtClosingTimeSpan)
{
   int  iOrders = OrdersTotal();
   bool bIsOpen = false;

   for(int iOrder = 0; iOrder < iOrders; iOrder++)
   {
      OrderSelect( iOrder, SELECT_BY_POS, MODE_TRADES);
      
      if((OrderType() == OP_BUY || OrderType() == OP_SELL) && OrderSymbol() == Symbol())
      {  // There is an open position for this symbol.

         datetime dtOpeningTime     = iTime(NULL, 0, 0) - TimeSeconds(iTime(NULL, 0, 0)); // The opening time of current bar
         datetime dtClosingTime     = dtOpeningTime + Period() * 60;                      // The closing time of current bars
         datetime dtCurrentTickTime = TimeCurrent() ;                                     // The time of current tick
         
         if(
            dtCurrentTickTime > dtClosingTime - dtClosingTimeSpan || // The current tick is within the closing time span.
            iVolume(NULL, 0, 0) == 1                                 // or this is the first tick of next bar
            )
         {
            if(OrderType() == OP_BUY && bCloseLong)
            {  // Close a long position
               bIsOpen = OrderClose(OrderTicket(), OrderLots(), Bid, 3, Violet);
               
               if( bIsOpen)
                  Print("Long position closed at: ", OrderClosePrice());
               else
                  Print("Error closing a position: ", GetLastError());
            }
            else if(OrderType() == OP_SELL && bCloseShort)
            {  // Close a short position
               bIsOpen = OrderClose(OrderTicket(), OrderLots(), Ask, 3, Violet);
               
               if( bIsOpen)
                  Print("Short position closed at: ", OrderClosePrice());
               else
                  Print("Error closing a position: ", GetLastError());
            }
         }
      }
   }
   
   return(0);
}
ファイル:
 

FSBがストラテジーの入ったDLLを生成して、関数がこんな感じになるといいんだけどな。

#define inp   100
//---

#import "FSB.dll"
int    bEntryAllowed(double close[ inp], double open[ inp], double high[ inp], double low[ inp], volume[ inp]);
#import


つまり、DLLに何本ものバーを送り、ストラテジーから応答を得るというものです。


dll自体は以下のようなものです。

#define WIN32_LEAN_AND_MEAN  // Exclude rarely-used stuff from Windows headers
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
//----
#define MT4_EXPFUNC __declspec(dllexport)
#define inp 100
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
  {
//----
   switch( ul_reason_for_call)
     {
      case DLL_PROCESS_ATTACH:
      case DLL_THREAD_ATTACH:
      case DLL_THREAD_DETACH:
      case DLL_PROCESS_DETACH:
         break;
     }
//----
   return(TRUE);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
MT4_EXPFUNC double __stdcall int    bEntryAllowed(double close[ inp], double open[ inp], double high[ inp], double low[ inp], volume[ inp])

  {
   int out;

   //--- strategy

   if ( close[1]> close[0]) out = 1;
   if ( close[1]< close[0]) out = -1;

   return( out);
  }
どうせ独自の指標を持っているのだから、時系列 データだけでいい。
 

後で完全なFSB <-> MT4ブリッジを提供するつもりです。

そのため、FSBはMTから見積もりと口座 情報を受け取り、取引注文を送り返すことになります。そうすれば、FSBのストラテジーをMTで取引できるようになる。


現在、FSBのストラテジーをEAとして相互運用するために、いくつかの基本的なEAフレームワークを作ろうとしているところです。


みたいな簡単なパターンがいくつか欲しいです。


* Bar Opening(またはIndicatorの値)でEnter(加算、減算、クローズ)する場合。

- condition1 == true; かつ

- condition2 == true; かつ

- condition3 == true; かつ

- 条件4 == 真

* バー・クロージングで退出する場合。

- condition1 == true; または

- condition2 == trueとする。

または

* Indicatorの値で終了します。

または

* 恒久的なストップロスで終了

または

* エントリールールに従って逆引きしてください。


ほとんどのインジケータは標準的なもので、その他はかなりシンプルで、MQL4で簡単に書き換えることができます。EAの基本パターンがあれば、インジケータの翻訳に問題はありません。


今テストしているのは

Bar Opening "でポジションをオープンし、"Bar closing "でクローズします。


そこで、2つの新製品を開発したいと考えています。

1.FSB:MTデータフィードおよび実行ブリッジ

2.MQL4へのストラテジーエクスポーター


おそらく、どちらのプログラムもオープンソースになると思います。

 

(あ、今話題が静かだと思ったので、盛り上げましょう :)!(たくさん書くつもりです......論理的になるようにします ;), そしてトピックをオーバーロードしないようにします - 私はいくつかのメッセージにそれを分割する)


皆さん、ようこそ


ミロスラフ - まず、「天候について」(歌詞の部分)の言葉をいくつか...。(あなたのロシア語の理解度が上がっていることを心から願っています :))) 。


もちろん、製品も最高です私は元プログラマーとして、また抽象的なユーザー(抽象的なソフトウェア)として、自分の経験から話しています。愛情が感じられるし(何事も丁寧にやっているから)、プログラムの開発が「突然」止まらない(死なない)希望がある。そうですね、論理的な間違いがあったり(Data Horizonがその一例)、インターフェースに小さなバグがあったり...。しかし、全体としては、「THIS IS THE SONG!ただの歌だ!!!


もうひとつ、明らかになった事実に注目していただきたい。批判に対する姿勢や、問題点/不具合/新機能などを議論するスタイル。これは、スレッドの冒頭、代替品の開発が始まったところ、SSBの作者が自分のアドレスに寄せられたコメントにどう反応したかという文脈の中での私です。ミロスラフもFREEのプログラムを開発する時間が「ワゴン」にあるとは思えません(そして、そんなプログラマーであることも)。しかし、彼は私たちのために(コミュニケーションをとる)時間を見つけ、私たちのコメントや要望に従って、製品を仕上げ、バグを修正し、新しいものを提供します(彼の最近の投稿をご覧ください)。そして、前述のSSBのケースのようにヒステリーを起こすことなく、すべてが冷静、慎重である。それは(特別な)尊敬に値します。よろしく、ミロスラフ...


歌詞の部分を(今更ながら気の抜けた話ですが)仕上げると、私自身は「ランダムな値動き」という理論の支持者であるということです。すなわち、この質問で私は完全に(のようなサイトのクリエイターを含む人々の特定のサークルの意見を共有 http://www.bigmany.ru )、誰が市場で働くことを確信している(私は外国為替と "それに近いすべて "を意味する)2つの主要市場指標(私が意味ボリューム)の(唯一の)第二を認識する方法はありません。- テクニカル分析やファンダメンタルズ分析の情報を鵜呑みにするのは無意味である。


我々は、一般的にここで終了することができた:)しかし、あなたが知っているように - ロシアでは、愚か者と道路のために悪名高く、この文の最初のポイントを使用して - 私はまだアイデア "数百万を作るために "を残していない :D, 実際には - 私はちょうど好奇心です.アナリストの意見」を聞くのも面白いし(占星術師が星占いをするように、「専門家が多い」、あまり意味がない)、チャートを見るだけでも面白いし(納得、すごい)、コードをいじるのも面白い(人が与えられた指標で何を表現しようとしているか、本当に分かってくる)、...。ただ、面白いのは...。いつか「システム」を騙す(あるいは騙さない)のも面白いかも...。そして、自分だけでなく、一般の方々のためにもなればと思っています。なぜなら、ミロスラフのように、人生におけるある種の利他主義者だからです。


現在、世界中で使われているテクニカル分析システムは、(その大多数が)実際に、マーケットに参加しているというのが、私の考えです。つまり、群衆はモニターを見ながら、指標の値に導かれて、友好的にある方向への動きを期待し、取引を行い...まさにその価格を動かしているのである。たとえ小規模であっても、常にではないにせよ(TAなどどうでもよくて、ある時間にある量を売買できればいいという「工場、新聞、蒸気船」のオーナーはまだいる)。でも、そうなっちゃうんですよねー。つまり、(同じTAの)「ループの中」にいることで、相場のポジティブなランダムな動きの確率を50%以上(少し?なかなか難しいですね...。BUT 可能!この仮定に失望した時点で、私はマーケットを去るだろう...。(利益や損失の大きさの問題ではないでしょう。ただ、完全にランダムなシステムの中で働くのは、まあ、本当にイライラするし、意味がないのですが......)さて)

 

では、本題に入ります。

1.ここが小休止している間、私は考えていたのです。そうですね、ミロスラフを待ちましょう(彼がMTとFSBの間のブリッジを作るか、ここでストラテジーコンパイラを作るか)。でも、結局のところ、少なくとも自分で何かをやった人が結果を出すわけですからね。)私は、与えられたツール(FSB)を持っている(保証されている)、MTを持っている、この2つの存在以外に何もないと仮定しよう、したがって、我々は彼らの枠組みの中で操作する、すなわち、から始めた。FSBは(現時点では)閉じたシステムなので、MTが必要になります。


2.Expert Advisorのコードですぐ止めます。私は、単純なExpert Advisorの作成者の楽観主義を共有しない - まあ、端末や市場の異常事態の数を想像することは不可能です。そして、私たちはお金の話をしているのですから、冗談は通用しません(彼らはエラーコードをチェックしていないのです。で終わり、-$1000は(条件付きで)消えます)。つまり、本当にお金(もっと言えばリアルマネー)を扱う専門家は、外的事象に対する反応が「鉄壁」でなければならないと確信しているのです。端末、サーバー、マーケット自体の動作に最大限のバリエーションを持たせるコードでなければならない。要するに--かなり深刻で、ジャンプでは解けない(書けない)のです。そんなパターン作りに参加できたら嬉しいですね。でも...


3.底辺からずっと行くことにしました。エキスパートアドバイザー(インジケーター)で操作するものがないのであれば、何のためにエキスパートアドバイザーが必要なのか、考えてみました。)だから、指標を取ったんです。

その前提は次のようなものだった。まず、FSBの指標の値がMTの標準指標や追加指標の値と同等であることは、誰も保証しない。そして、両プログラムで「比較可能」な結果を得るためには、 - 値が同じであることが必要です。第二に、指標そのものの数(基準)がALWAYSで異なることです。そして、外部のものを使う(検索する)には...。標準と自分(の生活)のどちらかが好きなんです。(3つ目 - FSBからのインジケータコードの「変換」は、ミロスラフが言ったように、それほどメガタスクではない印象があります - アルゴリズム自体は非常にシンプルで、インジケータ自体はコード的に非常に「整理」されていて(コードは統一)、つまり、大まかに言えば - 一連のエラーを作成しているのですが、そのようなことはありません。大雑把に言うと、一度テンプレートを作って、そこに一つ一つ何らかのインデックスを「埋めていく」(これが理想像です :)) ということです。)4にもあるんだー、気になるー(笑)。

ともあれ、そんな週末であった。私は普段、何かを始める前に「じっくりとハーネスをつける」(この場合は「考える」)ようにしています。テンプレートそのものを修正する時間がない(それは理解している)。特に、指標の数がある数値を超えた場合。だから、重要なポイントは一気に設計すること。その結果、次のような前提条件ができました。


- これらはインジケータであるべきです(Expert Advisor の将来のコードのための単なる関数ではありません)。結局のところ、情報の視覚的認識は人間にとって(特に私にとって)少なくとも役割はなく、Expert Advisorコードからのインジケータの呼び出しはそれほど大きな問題ではありません(iCustomは すでにフォーラムで多くのトラブルを引き起こしました - 多くの意見があるとき、私は通常、自分ですべてをチェックしたい、私の「フィールドテスト」の結果が行います、おそらく小さなオーバーヘッドがありますが、 は大きなものではない (これは私が全責任を持って宣言します)、私は普遍性の観点から無視していいと思います)。しかし、「特別な目利き」のために :)(念のため) インジケータでの計算が、同じタイプの別の関数で行われる場合に備えて (下記参照)。


- 指標は、オリジナルFSBと同じ値を出力すること(以下、別途交渉事項)。つまり、FSBのコードをベースにして、可能であれば、できるだけ手を加えない。


- IndicatorCountedで正しく動作するようにコードを最適化する必要があります(速度によるものなど)


- 指標となるパラメータやその値は、一様かつ均質であることが必要です。データ型の話ではないです。Miroslavのインジケータのコードを見ると、入力パラメータと出力バッファの均質性が良いのが分かるかもしれません。パラメータを指示するときや指標値を取るときに、ユーザーが簡単に誘導できるように、最初のイメージを保つことが課題です。

- 前項の意味するところは・・・。mm(注意 - 、これは重要ですすべての指標を使う上で重要なのは、それ自体が何らかの価値を生み出すということではありません。それは、 SIGNALSを生成することです!本当に、私としては - インデックスの値が今と後で何の違いがあるのか(!)それはまだ「理解不能な数字」です。理解できるのは、「買い」か「売り」かのどちらかである場合です :) 。それ以外はすべて「不明」です!ミロスラフはこのアイデアを非常にエレガントに使い、各インジケータ(ロングとショートポジション用)に2つのバッファを作成し、指標の使用方法(ポジションまたはロジック条件のポイントとして)に応じて、ポジションのオープン/クローズまたはYes/Noフィルタ(オープニングロジックですべて「Yes」ならオープン、クローズロジックで少なくとも1つ「No」ならクローズ(通常、RTFM))のいずれかの値を取得するようにしたのです。天才だ!;) この方法に従って、この挙動をシミュレートして みました。現在、インジケーターの最初の2つのバッファ(その値はデータウィンドウで見ることができます)は、それぞれフィルター(1/0)またはロングまたはショートにポジションを開くための価格の値で対応するバッファです。 例えば、次のようになります。その後、Expert Advisorのコードで指標を使用する場合、特定の指標が何を、どこで、どのような値を生成するかは気にしません - それは単に非常に単純な主題(Yes/No(条件付き)またはそこからの価格の直接買収)のために最初の二つのバッファの値を分析します...で、終わり!?石墨ではほぼ100%「つまずく」(そこでは、インジケータ自身のバッファの量がMT自体の限界(8)に近い)。- いいアイデア(最初の2つのバッファで)を拒みたくはないのですが、1つにまとめることができません(考えていたのですが...)。は1/0(ビットマスク化できる)だけでなく、値札もありうる)。もっとも、インジケーターの値そのものをどうにかしないといけないのでしょうが......。今に見てろ...このままでは...

 

一般に、要するに(要約):品質(FSB互換性、バグフリーなど)、さらなる使いやすさ、速度、コードの可読性。この順番で。

さて、そして(実際に)-何が起こったのか...(簡単な歴史)

-すべてのインジケーターのファイル名プレフィックスには「fsb」という値があります(例:「fsbBlaBlaBla.mq4」)。


-インジケーター自体を疑似ランダムな順序で取得したので、私を責めないでください。これまでのところ、それはあります。さらなる議論/分析などのために。 -それで十分だと思います。


-Miroslavは、3つの外部関数(ソース(ページの一番下)に配置されています)を使用して、移動平均と論理バッファーの値を計算します。私は彼らから始めなければなりませんでした。すべての関数は1つのファイル( " fsbCommon.mq4 ")にラップされ、ライブラリ関数( " fsbCommon.mqh ")として配置されます。このオペラからの別のファイル( " fsbConstants.mq4 ")があり、それぞれ、コードの便宜のために定数が含まれています。関数自体に特別な問題はありませんでした(「ロジックオシレーター」の初期ロジックを多少複雑にしましたが、追加のチェック(範囲外の配列、正しい初期値が保証されています(歴史上最初))(ミロスラフ、このトピックのコードの論理エラー)..そして、MovingAverageでiShiftの動作を「エミュレート」して、関数がこのパラメーターの正常な値の結果のバッファーの値を正しく入力するように長い間試みました(元の元のコードで与えられた制限だけでなく)...その結果、私は今のところこの問題を放棄し、最初に「スタブ」を配置しました(「0」以外のiShiftを使用すると、関数は機能しません)まだ動作しますが、まだ必要ありません))MovingAverageは面倒であることが判明しましたが、1つの石で数羽の鳥を殺します。関数からバッファをMTの値として返すため、それは不可能です(おそらくそうではありません)。必要)-最後に追加のパラメーターが表示されます( afTarget )また、 IndicatorCounted ()を考慮して、もう1つのステップパラメータは、処理する最初のバーの値を担当します。さて、最後の追加パラメータは、MTの観点から「価格定数」を設定します。その値によって、MovingAverage自体の値が既存の系列の配列に基づいて計算されます。 iAppliedPrice 「価格定数」MTの値の範囲外)-に基づく afSource 。 (したがって、コードのオーバーロード)プログラミングのニュアンスをすぐに指定します-ケースごとに選択が散在するサイクルがあります-サイクルは選択内に挿入され、(通常はより論理的です)その逆ではありません。正しく行う方法がわからないからではなく、どれだけ速いかを知っているからです:)! (まあ、将来的には、コードを分析したい人は誰でも、これについては詳しく説明しません-歓迎しますが、「コードの愚かさについて」質問する前に、(潜在的に)何がそのような原因になる可能性があるかについて少し考えてくださいプログラミング)。


別のニュアンスはMovingAverageに関連しています(誰かにとって有益かもしれません)-なぜなら。指数平滑化モード(平滑化を含む)での移動平均値は、それ自体の以前の値に直接依存します-「開始点」の選択は非常に重要になります(さらなる計算の基礎としてどの値を取るか)。通常、これにはいくつかのアプローチがあります。誰かが前の期間の終値を取ります。誰かが前の期間の価格を平均しましたN...ミロスラフは2番目の方法で行きました。 MTが明らかに最初に来ます。したがって、チャートの最初にあるこれら2つの平滑化モードの重大な不一致(MovingAverageと他のすべて( " fsbTest.mq4 ")をテストするために1つの空白を追加しました)!そして、MovingAverage自体のデータの可用性に関する関数内で私が課した制限 iFirstBar、または同様の量の計算値 iFirstバー。なぜならインジケーター自体は、チャート上のバーの最小値(現在は2000)に定数を使用します。これは、どのような状況でも十分なはずです(200を超える期間のパラメーターをまだ見たことがないため)。もちろん、一度に複数のMAが使用されない限り;)。


-前の段落と同様に、このプロジェクトでの作業ですでに使用している外部サブ関数のファイルが作成されました(プレフィックス "st": " stCommon.mq4 "、 " stCommon.mqh "、 " stConstants.mq4 ")


-まあ、実際には-指標自体。非常に短い用語で(例として「バーレンジ」を取り上げましょう):

 // extern int slotType = SLOT_TYPE_LC;
外部の int indLogic = INDICATOR_RISES ;    //(INDICATOR_RISES <= indLogic <= INDICATOR_LOWER_LL)
外部の int nBars = 1 ;                  // 1 <= nBars <= 200
外部の int fLevel = 0 ;                  // 0 <= fLevel <= 500
外部の bool iPrvs = True ;                // 真/偽

slotType セット タイプ スロット FSB(Point of the PositionまたはLogicCondition)の用語エントリー/エグジットフィルターだけでなく、始値/終値も設定できるインジケーター-このパラメーターは、インジケーターがロジックバッファーに生成するものを正確に決定します。 fsbConstants.mq4のすべての定数を参照してください(すべてが非常に明確です)

indLogic -実際、インジケーターの論理条件(値に応じて異なるセマンティック負荷を実行します) slotType

さて、パラメーターはさらに進んで、forexsb.comのインジケーターソースに表示される順序と、FSB自体にどのように表示されるかを示します。パラメーターの境界はコメントで指定され、PCheck()サブ関数を呼び出すことによってinit()を呼び出すときに制御されます。

 double LPIndBuffer [];            //ロングポジション#1
double SPIndBuffer [];            //ショートポジション#2

doubleIndBuffer [ ];              //インジケーターの値#3

doubleIndBufferDD [ ];            //描画#4用の追加バッファ
doubleIndBufferDU [ ];            //描画#5用の追加バッファ

バッファーを使用すると、グローバルレベルのすべてがインジケーターバッファーとして使用されます(インジケーター自体に接続されます)。必要な論理値(LPIndBuffer []、SPIndBuffer [])(常に常にこの順序(#0-ロングポジション、#1-ショートポジション))、IndBuffer[]-インジケーター自体のデータ。ただし、この場合、色ヒストグラムが使用されるため、このバッファーは値自体のみを保持し、2つの追加のバッファーが演色に使用されます(正直なところ、MTはインジケーターを転送するだけでプログラミングを開始しました:)。それ以外の場合は、MT内の色ヒストグラムの動作をシミュレートします-私はそれを思いついたことがありません(誰がそれを知ることができますか?これが可能であるかどうか))。データウィンドウには表示されません。

初期化() すべてが通常どおりです(パラメーター値がチェックされ、インジケーター自体の名前とインデックスが設定され、バッファーが接続されているなど)


deinit()では、インジケーターを閉じない場合(パラメーターがリセットされないようにするためなど)にロジックを挿入することを考えています(まだ優先順位はありません)。


始める() 非常に原始的です。そのタスクは、チャート上に十分なバーがあることを確認し(MAを計算するため、および一般的に)、インジケーター自体を計算するための関数を呼び出すことです。呼び出しが成功すると、インジケーターのカスタム描画が呼び出されます(必要な場合)この場合は-onceのように、なんらかの方法で特別な方法で描画されます)


Calculate() -実際の計算。一般に、コードはMiroslavのコードに似ていますが、IndicatorCounted()に関連する最適化には例外があります。インジケーターを計算するために追加のインジケーターバッファーが必要な場合、それらは関数自体の内部に設定され(静的)(インジケーター自体のインデックスを無駄にしないように)、BufferSync()関数によって処理されます。これは別のジョークです。最初は、もう1つの定数パラメーター(iMaxBars)によって計算を制限しようとしました。歴史の存在下、不在、未来への動き(引用符の到着、右への配列の増加(私は今、視覚的に、グラフィカル表現について)における一連の配列の動作の「フィールドテスト」(パート2) ))、...過去への移動(履歴が欠落している場合(チャートの左側に移動)、端末がサーバーからそれをロードします...そして配列が左側に拡張されます)...そうです。 ..壊れた。私はそれを美しくしました(それをやろうとしました)-拡張BufferSync()の方向に応じて、配列または配列を拡張します。左または右、空のEMPTY_VALUE値を入力します。ここでは、MT自体だけが通常インデックス配列をLEFTに拡張しません。彼は常にそれらを右に展開します([0]バーの横から)。私が話していることが明確であることを願っています-履歴の次のジャンプ中に、チャート上のバーの値がiMaxBarsを超えるとき(もう一度ジャンプすることによって)-インジケーターがその値を描画しない状況はかなり可能ですiMaxBarsの左側にありますが、ここに「奇妙なデータ」があります。iMaxBarsの左側に簡単に配置できます。多分誰もそれらを見ないでしょう...しかし「美しくない」(私たちの方法ではありません)。そして、必要なのは、MT自体が正しい方向に空の値でバッファーを補足することです...そのような状況をキャッチすることは潜在的に可能ですが...一般的に、私たちは最初から描画しますチャート..._常に_。 (まあ、この特定の指標で可能な限り)


もう1つのニュアンスは、IndicatorCounted()に関連付けられています。計算されたバーの値を返すと、あなたに対する請求はありません...なります!責任があるのはIndicatorCounted()自体(およびMQのプログラマー)ではなく、この関数の神聖な目的に達していない多数のカスタムインジケータープログラマーだと思います。したがって、常に少数の潜在的な値を返す必要があります。チャート全体を再計算するか(IndicatorCounted()== 0)、最初のチャート((IndicatorCounted()== Bars-1)または2つ(IndicatorCounted()== Bars-2))を再計算します。つまり、たとえば、接続が切断され、チャートが複数のバーを「実行」した場合、それだけです...「木が立って死んだ」(IndicatorCounted()== 0)-チャート全体を新しい理由でカウントします。スキップされた小節の数(3、4、... 5 ... 10 ...)を返すことは不可能でしたか?(これは、私が最初に理解したように、この関数が意図したものです)一般に、このように。 ..

...私はRSIに「つまずいた」。そしてあらゆる意味で。まず、私はミロスラフのコードを理解していませんでした(彼への質問は以下にあります)。第二に、インジケーターをテストしているときに、MTとFSB内で取得された値に不一致が見られました!いいえ、それはあなたが思っていたものとはまったく異なります(「曲がりくねった忍耐」-まあ、それを認めてください、あなたは思った;))。残念ながら、要点はこれらの宣言にあるようです。

 float [] afPos = 新着 フロート[バー];
..。
floatsum ; _
..。

簡単に言えば- フロート!少し考えた後、とりあえず減速しました。最初の論文(正確さと品質)は疑わしいものになりました(そしてそれは優先事項です)。


ここでは、次の理由が考えられます。一方で、フロートは悪くありません。いわば、指標値の「粗面化」であり、これにより、取引戦略が市場のランダムな急上昇の影響を受けにくくなります。一方、たとえば、あるfLevel(たとえば、1.0)を超えると、同意します。0.99998と1.00001は2つの大きな違いです:)。そして、そのような矛盾があります。そして、そのような瞬間にポーズが開いたが、実際にはFSBレベルがまだ1.0に達せず、下がった場合、誰が責任を負うのでしょうか。 (インジケーターを転送した人:D ?!)


実際には2つの解決策があります(float MTがサポートされていない場合!):


-MT自体のフロートをエミュレートします(NormalizeDouble(X、Digits + 2)のようないくつかの悲痛な構造を使用)-まあ、どこでもではありませんが、各乗算/除算は


-FSBのfloatをdoubleに変更します。ここでは、明らかに有限である変更の範囲を理解する必要がありますが、どこでも注意深く歩く必要があります。そして、人間で生成された戦略の潜在的な結果が「浮かぶ」可能性があること。そして、一般的に、ミロスラフはそれを必要としますか? (私の謙虚な意見は、FSB自体がこれを必要としているということです。なぜなら、余分な精度は誰にも害を与えたことがないからですが、この時間のセクションでは、計算の速度で(この目標が追求された場合(?)、これ以上理由がわからないため)現実のそれは重要な影響を与えるべきではありません。)私はMQの人たちとこの問題に同意します-なぜなら。整数数学(一部は10進数)で操作しない場合は、少なくとも可能な限り高い精度で試行します。一般的に、ここにそのような...簡単な質問ではありません...

 

冗長ですみません(これ以上は言いません、エッセンスだけです)。


意見を聞きたいのですが、このテーマは続けるべきでしょうか(さらに「行ってしまう」、掘り下げるべき指標の残り)?私もいくつかの順序で(すべて同じ元の混乱以来:)、誰が、多分、何が前進する必要がありますすることができます。時間は、残念ながら、一般的なケースでは奪われている(オフィスにいる副社長-「気づかないうちに一日が過ぎていく」:D)。でも、1日に1つか2つの指標なら、提供できると思うのですが...。



では、この話題についてミロスラフに質問を...。

1.fMicronの 値を教えてください(私は(反省して)0.000001に 設定したようですが、もっと少ないのでしょうか?


2.パラメータbIsDescreteValues (オシレータロジック内)とは何ですか。意味はわかるのですが、その初期値はどうなっているのでしょうか?また、その変化はどのような条件によってもたらされるのでしょうか?(あるいは、(FSBのインターフェースやその他の場所で)何に関連しているのか、とでも言いましょうか)


3.実はRSIについて、このデザインは何なのか?

for (int iBar = iFirstBar; iBar < Bars; iBar++)
{
afPosMA[iBar] = (afPosMA[iBar - 1] * (iPeriod - 1) + afPos[iBar]) / iPeriod;
afNegMA
[iBar] (afNegMA[iBar - 1] * (iPeriod - 1) + afNeg[iBar]) iPeriodを 設定します。
}

:)?質問の動機は次の通りです。私のビジョンが正しければ、それはスムージングされたMAです。コード全体の文脈では、それはすでに計算されたMAに適用され、最初の値だけが "生きている" :)まま、平滑化されたMAを生成することである。論理的な質問ですが、ここで余計なものは何でしょうか?この構造は、特に、 REALIZED(!)インディケータ自体のRSIスムージングモードの選択(それは常に平滑化されたことが判明)だけでなく、その依存するものであることです。または、afPos, afNegの以前のMA計算(パラメータから正しいモードを使用)は?


明らかに、古典的なRSIは、平滑化された平均に基づいて います。しかし、少なくともシンプルMAを使ったバリアントがあり、上記のコードを削除してmaMethodパラメータの動作を動作可能にすることは論理的なことでしょう。あるいは、このサイクルの前にMA計算を削除し、すべての指標のMA RSIパラメータを削除します(とにかく何も影響を及ぼさないので!)。


私ならこのコード(上記)を削除します :).(コンバートされたインジケータでは、この部分はコメントされ、誰が元の機能を必要とします - コメントタグを削除してくださいRSIコードはあくまで参考です...ここで決まるまでは、「自己責任で」使いたいと思います :))


4.すでに述べたように、最初のバーでの動作において、オシレーターのロジックに致命的でない誤りがあります。今はまだ分からないので、明日にでも書いてみます(どこをどう修正すればいいのか)。


5. FSBのフロートをどう するか?(あるいは MTの欠落で ) :)?


アーカイブには必要なファイルが含まれており、MTのルートに展開されます(アーカイブは次の記事で紹介します)。


皆さん、頑張ってください・・・。書き込む)
 

現在のインジケーターアーカイブ (2009-04-15)

ファイル:
experts.rar  101 kb
 

フロートには勝てない、出口を探さないといけないというのは同感です。通信文を書く必要がある。そして、インジケーターのライブラリーを作成します。お手伝いできることがあれば、うれしいです。