// //< >
// < 1. Data 7 = 4 i 3 d - s > //< >
// < 1.1. Input 7 = 4 i 3 d - s /> //< >
// < 1.2. Buffer - = - i - d - s /> //< >
// </1. Data 7 = 4 i 3 d - s > //< >
// //< >
// < 2. Code 9 / - i 82 l 4 o > //< >
// < 2.1. Interface 6 / - i 71 l 4 o /> //< >
// < 2.2. Special 3 / - i 11 l - o /> //< >
// </2. Code 9 / - i 82 l 4 o > //< >
// //< >
コードの整合性を管理するために、以下の表記を用いる。 関数の入力数、つまり関数の引数の数は "i "と表記する。 コードのオープンライン数を "l "と表記する。 関数の出力の数は "o "と表記する。 任意の値を返す関数は常に "1"、それ以外は"-"である。 左列はドメインに含まれる関数の個数。
4.ドメイン
ドメインのヘッダである。
////////////////////////////////////////////////////////////////////< 2>
// < 1.1. Data : Input > //< >
// //< >
// < 1.1. Input 7 = 4 i 3 d - s > //< >
// < 1. Strategy 4 = 2 i 2 d - s /> //< >
// < 2. Trading 3 = 2 i 1 d - s /> //< >
// </1.1. Input 7 = 4 i 3 d - s > //< >
// //< >
////////////////////////////////////////////////////////////////////< 3>
// < 1.2. Data : Buffer > //< >
// //< >
// < 1.2. Buffer - = - i - d - s > //< >
// </1.2. Buffer - = - i - d - s > //< >
// //< >
////////////////////////////////////////////////////////////////////< 4>
// < 2.1. Code : Interface > //< >
// //< >
// < 2.1. Interface 6 / - i 71 l 4 o > //< >
// < 1. iNewBar - i 4 l 1 o /> //< >
// < 2. iSignalOpen - i 15 l 1 o /> //< >
// < 3. iSignalClose - i 15 l 1 o /> //< >
// < 4. iGetTicket - i 7 l 1 o /> //< >
// < 5. iTryOpen - i 15 l - o /> //< >
// < 6. iTryClose - i 15 l - o /> //< >
// </2.1. Interface 6 / - i 71 l 4 o > //< >
// //< >
////////////////////////////////////////////////////////////////////< 11>
// < 2.2. Code : Special > //< >
// //< >
// < 2.2. Special 3 / - i 11 l - o > //< >
// < 1. init - i 1 l - o /> //< >
// < 2. deinit - i 1 l - o /> //< >
// < 3. start - i 9 l - o /> //< >
// </2.2. Special 3 / - i 11 l - o > //< >
// //< >
こんにちは、Aisさん
ご回答ありがとうございます。私が複雑さを理解するのを助け、さらに複雑さを軽減するのを助けてくれるというのは、私が求める以上のものでした。私はあなたの寛大さの前に自分自身を謙虚にします。ありがとうございます。
あなたのプログラムにおけるコメント構造について質問があります。私は進行している思考の列車を降りたいわけではないのですが、フォーマットがどのように見えるかという質問は、私にはなじみがありません。
例
// 構造 4領域17要素 > //< >.
// < 1.データ 2ドメインに8要素 /> //< >
// < 2.コード 2ドメインで9要素 /> //< >
// </Structure 4つのドメインに17の要素 > //< >.
// //< >
// < 1.データ 8 = 5 i 3 d - s > //< > < 1.1.
// < 1.1.入力 7 = 4 i 3 d - s /> //< >.
// < 1.2.バッファ1=1 i - d - s /> //< >.
// </1.データ8=5 i 3 d - s> //< >.
// //< >
コメントの構成がとてもパースしていますね。タイトルとサブコメントで、私が読んだものを説明するのに最適な方法でしょう。まるで、コードマシンで開発され、フォーマットされ、構造化されたコメントのようですね?それは印象的です。コメントされた内容をすべて理解しているわけではありません。あなたの構成能力が新鮮に感じられます。
ありがとうございました。私はプログラムを勉強し、近い将来、より多くの質問をすることになるでしょう。
乾杯
ハックルベリーさんこんにちは
嬉しいです。
1.構造
構造は私が独自に開発し、整形したものです。
// //< > // < Structure 16 elements in 4 domains > //< > // < 1. Data 7 elements in 2 domains /> //< > // < 2. Code 9 elements in 2 domains /> //< > // </Structure 16 elements in 4 domains > //< > // //< >
最初の意図は、グローバルデータとコードを厳密に分離することです。
私にとってのコンピュータ・プログラムは、実世界のモデルです。
グローバルデータとは、この世界のものである。
コードは動作の集合体である。
この2つを分けることで、両者の違いを理解していることを強調しているのです。
要素の数を数えることで、プログラム内のすべてをチェックし、制御することができるのです。
2.2. 書式設定
書式設定は、簡単なHTMLです。
以下のタグは、プログラムの一部を開いています。
// < > //< >
次のタグは、プログラムの一部を閉じます。
// </ > //< >
次のタグは、プログラムの一部を一行で記述するときに使用します。
// < /> //< >
タグの終端は、現在、ページカウントのために使われています。
将来は、このタグの使い方を拡張する可能性があります。
//< >
ページ構成は、プログラム内の移動を容易にするために役立ちます。
<Page Up>と<Page Down>を使うと、いつも同じ場所で同じ種類のタグを見ることができます。
3.3.要素
データの要素は、単一のグローバル変数 です。
配列も1つの要素に見えます。
ローカル変数は、コード要素の一時的な存在に過ぎません。
コードの要素は、単一の関数 です。
また、メソッドという言葉も使うことができます。
また、「メソッド」という言葉も使えますが、私は「インターフェイス」という言葉を関数の集合体に対して使っています。
複雑さを軽減するために、私はデータとコードを論理的なドメインに分割している。
ドメインの数はプログラムの構造によって異なる。
通常のデータのドメイン:「入力」、「設定」、「制御」、「バッファ」・・・
通常のコードのドメイン:特殊な機能の集合は「スペシャル」、その他の機能の集合は「インターフェイス」。
大規模なプログラムでは、異なる「インターフェイス」を持つ「オブジェクト」を作成することができます。
データ要素とコード要素の整合性を制御するために、カウントを使用しています。
// //< > // < 1. Data 7 = 4 i 3 d - s > //< > // < 1.1. Input 7 = 4 i 3 d - s /> //< > // < 1.2. Buffer - = - i - d - s /> //< > // </1. Data 7 = 4 i 3 d - s > //< > // //< > // < 2. Code 9 / - i 82 l 4 o > //< > // < 2.1. Interface 6 / - i 71 l 4 o /> //< > // < 2.2. Special 3 / - i 11 l - o /> //< > // </2. Code 9 / - i 82 l 4 o > //< > // //< >
オープニングタグとクロージングタグには、同じ合計が含まれる。
通常、オープニングタグでカウントを行います。
そして、閉じタグの代わりに開きタグをコピーして挿入し、閉じスラッシュ「/」を追加するだけである。
データの整合性を管理するために、次のような記法を用いる。
integer "のデータ要素数を "i "と表記する。
double "のデータ要素数を "d "と表記する。
文字列 "のデータ要素数は "s "と表記する。
左の列は、"i" + "d" + "s "の行の合計を含む。
コードの整合性を管理するために、以下の表記を用いる。
関数の入力数、つまり関数の引数の数は "i "と表記する。
コードのオープンライン数を "l "と表記する。
関数の出力の数は "o "と表記する。
任意の値を返す関数は常に "1"、それ以外は"-"である。
左列はドメインに含まれる関数の個数。
4.ドメイン
ドメインのヘッダである。
////////////////////////////////////////////////////////////////////< 2> // < 1.1. Data : Input > //< > // //< > // < 1.1. Input 7 = 4 i 3 d - s > //< > // < 1. Strategy 4 = 2 i 2 d - s /> //< > // < 2. Trading 3 = 2 i 1 d - s /> //< > // </1.1. Input 7 = 4 i 3 d - s > //< > // //< >
////////////////////////////////////////////////////////////////////< 3> // < 1.2. Data : Buffer > //< > // //< > // < 1.2. Buffer - = - i - d - s > //< > // </1.2. Buffer - = - i - d - s > //< > // //< >
////////////////////////////////////////////////////////////////////< 4> // < 2.1. Code : Interface > //< > // //< > // < 2.1. Interface 6 / - i 71 l 4 o > //< > // < 1. iNewBar - i 4 l 1 o /> //< > // < 2. iSignalOpen - i 15 l 1 o /> //< > // < 3. iSignalClose - i 15 l 1 o /> //< > // < 4. iGetTicket - i 7 l 1 o /> //< > // < 5. iTryOpen - i 15 l - o /> //< > // < 6. iTryClose - i 15 l - o /> //< > // </2.1. Interface 6 / - i 71 l 4 o > //< > // //< >
////////////////////////////////////////////////////////////////////< 11> // < 2.2. Code : Special > //< > // //< > // < 2.2. Special 3 / - i 11 l - o > //< > // < 1. init - i 1 l - o /> //< > // < 2. deinit - i 1 l - o /> //< > // < 3. start - i 9 l - o /> //< > // </2.2. Special 3 / - i 11 l - o > //< > // //< >
数え方のルールや表記は、プログラムのヘッダと同じである。ドメインのヘッダの開始タグをプログラムのヘッダにコピーしているだけです。ドメイン内の各ページには、開始タグと終了タグがあります。例えば
////////////////////////////////////////////////////////////////////< 12> // < 2.2.1. Code : Special : Init > //< > .. // </2.2.1. Code : Special : Init > //< >
先頭の数字は、構造体のパーツのカウントとナビゲーションのために使われます。
次に、プログラムの "Data "または "Code "の部分を表す表記が続く。
次にドメイン名。
続いて、ドメイン名の後に、ドメインに含まれる要素の名前が続きます。
これが参考になれば幸いです。
それでは、お返事をお待ちしています。
Aisさん、こんにちは。
あなたの構成のセンスは......なんというか......実践的でセンスがありますね。
HTMLを統合することで、簡単なナビゲーションが可能になりますが、現時点では私には理解できません。
非常に良い。
今、私は送られてきたプログラムを一つずつ分解しているところです。 変数に関するコンセプトは
変数に関するコンセプトは理解できます。ありがとうございました。
また、質問させていただきます。
では
Aisさん、こんにちは、、、<編集中です>。
プログラムはまだ吸収されていません。お時間を取らせてしまい申し訳ありません。私が見落としている部分があるのでしょう。
というのも、1つエラーがあるのです。
明日また来ます。
では、また。
ハローハックルベリー
いくつかの機能は例として追加されたもので、簡単に変更または削除 することができます。
プログラムの改善は永遠に続くプロセスです。
今のところ、さようなら
:)
ハックルベリーさんこんにちは
いくつかの機能は例えば追加されたもので、簡単に変更したり削除することができます。
プログラムの改善は永遠のプロセスです。
今はさようなら
:)
Aisさん、こんにちは。いつもありがとうございます。
昨夜、あなたのプログラムをコピーしているときに、ようやく自分の間違いに気づきました。
現在、いくつかの変数が何のためにあり、どのように動作するのかを理解しようとしています。
iSignalCloseは、OrderClosePriceを確立するために私の他のプログラムの一部を挿入しているところです。提案
あなたの提案で
dDelta = OrderOpenPrice () - OrderClosePrice。
とすると、プログラムの柔軟性が高まります。
また質問させてください。コメントもお待ちしています。
乾杯
Aisさんこんにちは
質問が発生しました。あなたのプログラムは、......iTryOpen()の中で述べています。
があるはずですが、私の好奇心から
以下は理解を深めるための別の質問です。 iNewBar が TRUE の場合、制御は iSignalOpen に渡されます。iNewBarがTRUE(現在のバーと同じ?)、またはiFirstRun = 1の場合、iFirstBar = 0。私はiFirstRunがdecaredと初期化されている場所を見ることができますが、それは何を意味するのでしょうか。このような単純な質問で負担をかけるのは申し訳ないです。この2つが関数の 中でどのように動くのか、計算することも見ることもできません。お時間のあるときに、クリアにしていただけないでしょうか。
また、ご苦労様です。)
乾杯
ハックルベリーさんこんにちは
どちらの質問も重要です!
回答1.
両方の条件は真ですが、もし:
1.1.がわかってい ます。
int iCommand = iSignalOpen () ; //< >
1.2. "iSignalOpen() "が返せる値は、"EMPTY", "OP_BUY", "OP_SELL "の3つだけだと分かっています。
1.3. 最初の値はすでにチェックされている
if ( iCommand == EMPTY ) return ; //< >
1.4. 2番目の値もチェックされる
if ( iCommand == OP_BUY ) //< >
1.4. 2番目の値もチェックされることが分かっている場合、最後のチェック "if" を省略して計算を少し速くすることが可能である。
else if ( iCommand == OP_SELL ) //< >
回答2
2.1.
"iTime ( 0, 0, 0 )" は、現在の不完全なバーの開始時間を返します。
現在のバーのインデックスは常に0であり、それは "iTime ( 0, 0, 0 )" の3番目の値です。
開 始 時 間 が 変 わ る た び に 、
2.1.1. "iTime_0 = iTime ( 0, 0, 0 ) ;" を代入して現在のバーの開始時間を保存します。
////////////////////////////////////////////////////////////////////< 5> // < 2.1.1. Code : Interface : iNewBar > //< > int iNewBar () // - i 4 l 1 o //< > { //< > static int iTime_0 = 0 ; //< > // //< > if ( iTime_0 < iTime ( 0 , 0 , 0 ) ) //< > { iTime_0 = iTime ( 0 , 0 , 0 ) ; return ( TRUE ) ; } //< > else { return ( EMPTY ) ; } //< > } //< > // </2.1.1. Code : Interface : iNewBar > //< >
2.2.iSignalOpen()のdHighとdLow、iSignalClose()のdATRの計算を始めるバーは、iBaseBar=1です。
バー番号1が同じである間は、これらの値も同じになります。
新しいバーでのみこれらの値を計算する理由です。
これにより、プログラムが高速化されます。
static int iFirstRun "という変数は、単純なトリガーである。
初期値「1」は、どんな条件でも最初のプログラム実行時に「dHigh」、「dLow」、「dATR」を強制的に計算させる。
これにより、プログラムの信頼性が向上する。
<後日追記
その通り、最初のプログラム実行では、"iSignalOpen()" の "iNewBar()" は "TRUE" を返し、"iSignalClose" は "EMPTY" を返します!
これは、"iSignalOpen() "の最初の実行である "iNewBar() "の最初の呼び出しでは、"iTime_0 = 0 "の値であり、"iSignalClose "の最初の実行では、"iTime_0 = 0 "の値であるため、このようになります。そして、2回目の "iNewBar() "の呼び出しでは、"iSignalClose() "の最初の実行の中で、"iTime_0 = iTime ( 0, 0, 0 ) "です!その結果、最初の実行を行わずに制御することができます。
その結果、1回目の実行がなければ、"dATR = 0 "となる可能性があります。
そのような最初の実行です。
</後で追加
その直後に「iFirstRun = 0」を代入すると、次の条件は新しいバーでのみ真になります。
if ( ( iNewBar () == TRUE ) || ( iFirstRun == 1 ) ) //< >
しかし!
iSignalOpen ()" と "iSignalClose ()" のコードの残りは、すべてのティックで 実行されます!
変更されない値の計算だけがスキップされます。
////////////////////////////////////////////////////////////////////< 6> // < 2.1.2. Code : Interface : iSignalOpen > //< > int iSignalOpen () // - i 15 l 1 o //< > { //< > static int iFirstRun = 1 ; //< > if ( ( iNewBar () == TRUE ) || ( iFirstRun == 1 ) ) //< > { iFirstRun = 0 ; //< > int iIndexH = iHighest ( 0 , 0 , MODE_HIGH , //< > iBaseLag , iBaseBar ) ; //< > int iIndexL = iLowest ( 0 , 0 , MODE_LOW , //< > iBaseLag , iBaseBar ) ; //< > static double dHigh ; dHigh = High [ iIndexH ] ; //< > static double dLow ; dLow = Low [ iIndexL ] ; //< > } // if //< > // //< > double dAsk = MarketInfo ( Symbol () , MODE_ASK ) ; //< > if ( dAsk > dHigh ) return ( OP_BUY ) ; //< > // //< > double dBid = MarketInfo ( Symbol () , MODE_BID ) ; //< > if ( dBid < dLow ) return ( OP_SELL ) ; //< > // //< > return ( EMPTY ) ; //< > } //< > // </2.1.2. Code : Interface : iSignalOpen > //< >
乾杯! :)
追記:後からいくつか指摘がありました。 そして、この指摘を見ると、明らかに「iNewBar ()」を修正する必要があります。 これは、一つのイベントをチェックするためにこの関数を2回呼び出したためです。 現在、同じイベントに対して、1回目の呼び出しで「iNewBar ()」は正しい値を返し、2回目で誤った値を返しています。 これから修正する予定です。
Aisさんこんにちは
わかりやすい説明ありがとうございます。もっと読み込んでフォローします。まだコードを完全に把握できているわけではありません。
しかし、あなたはiNewBarのように修正しなければならない何かがあったということですか?バック テストで判明した問題でiNewBarが悪いとは思えません。2つの問題の可能性?
バックテスト後にチャートを開くと、こんな感じでした。Askが過去20バーの最高値より上にあるとき、Buyエントリーがあることが分かっています。売りはその逆です。しかし、エントリーは一貫していません。この辺が見えたのでしょうか?
もう一つ発見しました。Hard StopはAtr*2という計算になっています。これは正しいのですが、どこで計算されているのかがわかりません。しかし、本当の問題は、TakeProfitも同じAtr*2計算をしていることです。Hard Stopがどこで計算されているかが分かれば、TakeProfitを修正できる可能性があります。この場合のTakeProfitはAtr*1だけでいいはずです。
お気をつけて、また明日。
乾杯
ハックルベリーさん、こんにちは
TakeProfitの条件は、私がテスト用に独自に考案したものです。
今は変更しています。
「Atr*2」「Atr*1」の代わりに「dATR * dFactorTP」「dATR * dFactorSL」を使用しています。
dFactorTP = 1.0" と "dFactorSL = 2.0" の初期値は、2ページ目の「データ」にあります。
このような解決策は、これらの値を簡単に最適化 することができます。
私は、関数 "iSignalOpen ()" と "iSignalClose ()" を変更しました。
新しいバーのチェックがこれらの関数に実装されています。
"iSignalOpen ()" の "Buy" と "Sell" の条件はおそらく正しいようです。
プログラムの完全版は次のページの添付ファイルです。
Cheers