閉じる問題、助けてください - ページ 8

 
Ais:


ご回答ありがとうございます。
このコーディングシステムは非常にシンプルで簡単です。
全てMetaEditorで手動で行います。
実際、大きなプログラムを簡単に高速で開発できるように設計されています。
システムも柔軟で信頼できるものでなければなりません。
よろしくお願いします!

Aisさん、ご返信ありがとうございます。あなたの書き込みから多くのことを学びました :)

カメオ

 

Hi Friends!

ある過去の出来事が、毎日毎日、私につきまとっています。
これはAIS5 Trade Machineへのドキュメントです。
神様の決めた通り、すぐに戻ってきます。

では、さようなら!

 

こんにちは、Aisです。
あなたの不在はとても寂しいです。お元気で。
お帰りをお待ちしています。
あなたの友人、乾杯

 

Aisさん、こんにちは
ご帰国後、早速の質問でご負担をおかけして申し訳ございません。あなたのシステムが特別なのではなく、私はほとんどのプログラムでこの問題があります。それは、ユーザー定義関数と 関係があります。ユーザー定義関数は、どのようにその定義を取得するのでしょうか。
例えば

int       iSignalOpen ()     //       - i      17 l       1 o     //< This is what iSignalOpen function will do.....
{                                                                 //< When the chart is opened, first pass..
if    ( ( iTradeBarTime    == iTime   ( 0 , 0 , 0 ) )   //< false input, EMPTY == (0,0,0)------|
      &&         //                                         &&                                 |--(return)EMPTY
      ( iTradeBarOnce    == 1 ))                        //< true  input, 1 == 1 ---------------|
      return ( EMPTY);
      
// This proves, 'EMPTY' will always be returned when the chart first opens. At the next tick...       
// ... 'iTime' will have parameters, example: (EUR/USD,HOUR_1,1) it is a predefined function so that...
// ... these parameters will be collected so that an expression can be calculated. Where as the... 
// ... 'iTradeBarTime' is not predefined. 'iTradeBarTime' was assigned 'EMPTY' at declaration earlier in the program.
// 'iTradeBarTime' knows that it is 'EMPTY'and nothing else. 
// When and how did 'iTradeBarTime' get deifined to collect data so that it's value can be other than 'EMPTY'? 
// The 'iTradeBarTime' has to have the same values as the 'iTime', or the input will never be 'true'?
// If it is never 'true', the return is always 'EMPTY'? 
本やフォーラムでは、明確な答えが見つからないようです。リレーロジックの回路図では、ANDゲートは上記の例と同じように動作します。2つの「真の」入力があるときだけ、「真の」出力があります。その時に初めて制御が継続されます。
ご回答をお待ちしております。よろしくお願いします。
乾杯
 

ハローハックルベリー

このコードの部分を明確にしましょう。

1.
1.1. すべての人間は異なる考えと行動をする;
1.2.私は厳密に限られた数のデータ型を使いたい;
1.3.
1.3.1. "int",
1.3.2. "double",
1.3.3. "string";
1.4.私は「標準」データ型のみを使用したい。他のデータ型は特別な場合のみ使用する;
1.5.
1.5.1. "int "データ型には "i"、
1.5.2. "double "データ型には "d"、
1.5.3. "string "データ型には "s"、
1.5.4. "undefined" データ型には "r "を使用する。


1.7. 定義済み関数と定数は、次のデータ型も持つことができます:
1.7.1. "bool",
1.7.2. "color",
1.7.3. "datetime";
1.8.
1.9. 今日、私のデータキャストは通常、暗黙的です。
1.10. 私のプログラミング技術のいくつかの要点:
1.10.1.TRUE "と "FALSE "のペアの代わりに "EMPTY "のペアを使うのが好きだった;
1.10.2. "if "文で、"TRUE" と "FALSE" の代わりに "1" と "0" を使うことがありました;
1.10.3.
1.10.4. 将来的には、名前に "b "をプレフィックスとする "bool "型を使用する予定です

2.
2.1. "int "は<!>signed</!> long 4-byte integer numberで、値は-2147483648から2147483647です。
2.2. "datetime" は<!>unsigned</!> long 4-byte integer number with values from 0 to 4294967295;
2.3. datetimeの値をint変数に代入すると、およそ2038.01.01まで正しい結果が得られる。

3.
3.1. この関数は常に「datetime」型の値を返します。
3.2. 戻り値には2つのケースがあります。
3.2.1. ローカルヒストリーが空の場合は「0」、
3.2.2. その他の場合は「シフト」で示されたバーのオープン時間
3.3.「
3.4. ゼロバーが同じ場合、"iTime ( 0, 0, 0 )" は同じ値を返す。
3.5.


3.6. "iTime ( 0, 0, 0 )" は新しい値を返します。
3.7. 従って、"iTime ( 0, 0, 0 )" の値はゼロバーが変わると変化しています。4. プログラムブロック「2.2.3.1. ヒストリデータの検査」で、空のヒストリを扱えないようにしました。

5. "2.2.3.1. History data inspection
"のプログラムブロックにおいて、空の履歴で作業することを防ぎました。

6. iTryClose関数で注文が成立した場合、「iTradeBarTime = iTime ( 0, 0, 0 ) ;」を代入しています。iSignalOpen」関数で「iTradeBarTime == iTime ( 0, 0, 0 ) )」かどうかを検査します。

7.もしそれが真で、"iTradeBarOnce = 1 ; "によって繰り返しの取引が禁止されているなら、"EMPTY "の値によってシグナルのオープンを禁止する。

乾杯

 

こんにちは、Aisさん
ご返答ありがとうございます。勉強してまた来ます。
乾杯

 

Aisさん、こんにちは。
お返事が遅くなり申し訳ございません。月曜日から本来の職業に復帰しました。最近、時間が少し短くなりました。勉強時間も短くなっています。
このスレッドでも書きましたが、私は物事をコツコツと分解していくことが好きです。あるスプロケットがどのようにして別のスプロケットに動力を供給しているのか、などです。だから、プログラム内の制御が魅力的だとわかったんだ。しかし、なぜ2.2.3.1ブロックが必要なのか、疑問があります。
iBaseLag + iBaseBarはどうして式になるのでしょうか?
iBaseLagとiBaseBarはiHighestとiLowestのパラメータ内にあると理解しています。明示的な数値でない限り
iBaseLagは20で、平均を計算するのに使われる20本のバーを表します。
iBaseBarは、どのバーから平均化を始めるかを表します。バー1から20まで、この場合、バー0は考慮されません。
私は勝手にプログラムを/* 2.2.3.1*/ で短くしました。プログラムをテストしたところ、同じ結果が得られました。実際の取引状況でプログラムを実行する場合、これは良いアイデアではないかもしれません。
あなたの考えをお聞かせください。
また、2.1.2ブロックの説明で、私の混乱が解消されました。iTimeはゼロバーのオープンタイ ムを返します。
iTradeBarTimeも同様にdatetimeをタイプキャストしたものです。プログラムは、どのバーで取引が行われたかを知っているので、1つのバーにつき1つの取引しかできません。iTradeBarOnce == 1です。
ありがとうございました。
これからもっと勉強します。しかし、reservered ブロック 2.1.1 は、既存のポジションに追加のポジションを提供する関数に使用できますか。例:既存のロングに、3つ以上のロングを追加する?
すでにプログラムに入っている機能で、追加ポジションとのコンフリクトはないでしょうか?
いつもありがとうございます。元気でいてください。
乾杯

 

ハックルベリーさん、こんにちは。

ブロック2.2.3.1.を含む、プログラムの主要な部分を注意深く見てみましょう。

////////////////////////////////////////////////////////////////////<        14>
// < 2.2.3. Code : Special : Start >                              //<          >
int       start   ()         //       - i       9 l       - o     //<          >
{                                                                 //<          >
// < 2.2.3.1. History data inspection 4 >`````````````````````````//<          >
static    int       iTrigger   = 0       ; if ( iTrigger == 0 ) { //<          >
  if  ( ( iTime ( 0 , 0 , 0 ) == 0                          )     //<          >
  ||    ( iBars ( 0 , 0     )  < iBaseLag     + iBaseBar    ) )   //<          >
          return                         ; else iTrigger  = 1 ; } //<          >
// </2.2.3.1. History data inspection 4 >`````````````````````````//<          >
//                                                                //<          >
// < 2.2.3.2. Main routine 3 >````````````````````````````````````//<          >
int       iTicket           = iGetTicket ()                     ; //<          >
//                                                                //<          >
if      ( iTicket < 0 )       iTryOpen   ()                     ; //<          >
else                          iTryClose  ()                     ; //<          >
// </2.2.3.2. Main routine 3 >````````````````````````````````````//<          >
//                                                                //<          >
// < 2.2.3.3. Exception handler 2 >```````````````````````````````//<          >
int       iTrap   =           GetLastError ()                   ; //<          >
if      ( iTrap   > 0 )       Alert  ( "Exception " , iTrap   ) ; //<          >
// </2.2.3.3. Exception handler 2 >```````````````````````````````//<          >
}                                                                 //<          >
// </2.2.3. Code : Special : Start >                              //<          >
////////////////////////////////////////////////////////////////////<         0>

このコードは以下の ように動作します。

1. ブロック2.2.3.1.は、プログラムの一番最初のブロックで、単純なトリガーです。
1.1. "static int iTrigger" は、プログラムの生涯を通じて自身の値を保存し、そのような "static" です;
1.2. 最初は "iTrigger == 0";
1.3. 文 "if ( iTrigger == 0 )" が各ティックで実行されている;
1.3. "static int iTrigger == 0" は、プログラムの生涯を通じて、自身の値を保存し、プログラムの生涯にわたって、自身の値を保存
します。4. iTrigger == 0のとき、初めてブロック{..}内でヒストリデータの検査が行われる;
1.5. ヒストリデータが不正な場合、return; が実行される;
1.6. mainfunction"start ()" の実行が終了したことを意味する;
1.
1.8. ヒストリのデータが正しければ、"iTrigger = 1 ;" が実行される;
1.9. その後、メイン関数 "start ()" の実行が続けられる;
1.10.
1.11. "iTrigger "の値は静的なので、現在も将来も常に"== 1 "です;
1.12. したがって、将来は常にヒストリーデータの検査をスキップします;
1.13. これがシンプルなトリガーです。


2.1. check if local history is empty "iTime ( 0, 0, 0 ) == 0";
2.2. check if local history is size enough for computation of "iATR ( 0, 0, iBaseLag, iBaseBar )", where. 2.2.1は、ローカル履歴が空であるかどう
かをチェックします。
2.2.1. "iBaseBar" は "iATR" の開始バー;
2.2.2. "iBaseLag" は "iATR" の平均化バーの数;
2.2.3."iBaseLag + iBaseBar" は通常の式で、結果は常に "iBaseLag" と "iBaseBar" の和になる;
2.2.4. 言い換えれば式 "iBaseLag + iBaseBar" は "iBaseLag" と "iBaseBar" の和と等価である;
2.2.5.
2.2.6. "iBaseLag = 100 ;" と "iBaseBar = 7 ;" を代入してみましょう;
2.2.7.と
すると、ローカルヒストリーのサイズが107以上であれば、「iATR ( 0, 0, iBaseLag, iBaseBar ) 」は正しく計算できる。なぜなら、計算のための最後のバー番号は #106で、バー番号0は常に考慮 されるからである。

2.1.1ブロックは、その実装の一例です。
追加のポジションを提供するには、ポジションの解析と管理について、関数2.1.4よりもはるかに複雑なコードが必要になります。
しかし、すべては可能です。

乾杯

 

Aisさんこんにちは
早速のご回答ありがとうございました。おっしゃることは大体理解できます。特にiATR関数について。iBaseLag + iBasebarという式を使うこと自体は、数式の一部として認められるということですね。定義された関数のパラメータと一緒でないと許されないという印象があったのですが。これは、ローカルヒストリーのサイズをチェックするためのもので、実際に進行するのに十分なバーがあるかどうかを確認するためのものです。そのような指摘なのでしょうか?これだけ多くのステップがありますが、目的を達成するために必要なステップです。見過ごしてしまうような、当たり前になってしまうようなステップ。
あとは、もっと噛み砕いてみます。ありがとうございました。
乾杯

 

ハックルベリーさんこんにちは
MQL4は、特にC言語やアセンブラなどと比較して、非常にフレンドリーな環境
です。
様々なチェックや トリックの必要性は著しく減少しています。
しかし、可能な限りのチェックを開発環境に実装することは、常にパフォーマンスを低下させることになります。
いずれにせよ、プログラムの動作不良の責任は常にプログラマにある。
ですから、私にとっては、冗長な再チェックの方が、例えば、境界の初歩的な破損よりも良いのです。
乾杯