どんな新人の質問でも、フォーラムを乱雑にしないように。プロフェッショナルは、通り過ぎないでください。Nowhere without you - 6. - ページ 207

 

皆さん、こんにちは。助けてほしい。

私のEAでは、MaxOrdersパラメータで指定された数の一連の注文を開きます。 以下に、これがどのように見えるかの例を示します。

1-order-lot=128

2-lot-order-lot=256とする。

3-lot-order=512の場合

4-order-lot=1024

5-order-lot=2048

これがテスターに必要なものです。

MaxOrders=5で、5件の注文が開かれている。問題は、ブローカーのテスターでは、1000に限定されたロットは4と5注文が必要なように開くことはありません。

ストラテジーテスターでこのパラメータを変更する方法をインターネットで探しましたが、見つかりませんでした。

そこで、この問題をプログラミングで解決することにしました。4つの注文のためにいくつかの注文を開いて、2つの注文を得ることにしました。

4-order-lot=1000

4-order-lot=24

を5注文分 3:

5-order-lot=1000

5-order-lot=1000

5-order-lot=48

が、2つの問題があります。

- 最大ロット数に応じてMMを分割する方法

- 注文を乱すことなく追加の注文を出す方法、つまりmaxOrdersより多くの注文が出るが、量を確保するために追加で出した注文は考慮しない。

 
solnce600:

アレクセイ、こんにちは。

私たちのコミュニケーションが頭から離れない......その理由は、ここにある......。

私のコーディングにはロジックがないとの指摘を何度も受けました。

昨日、ブール代数のことだと説明されましたが、このテーマはとても広く、とても奥が深いのです。

実は、私は数学者ではなく、ましてや代数学者でもない。

複雑でない数学的なことは理解できるのですが......、一度には理解できず、複雑なことは脳が全く認識できないのです。

半年以上前、MCLのプログラミングの教科書を勉強し始める前に

数学的な能力がなくても理解できるかどうか。

しかし、コズロフ氏は教科書の序文で、「実は一見したところ、もっとシンプルなんだ」と述べている。

一見して

そして実際、彼のチュートリアルの60-70%は理解できたと思います(おそらく初めてではないと思いますが)。

昨日までは、(私には理解できない)複雑な数学的計算はすべてプログラムがやってくれていて、私はそのルールを知るだけでいいと思っていた。

プログラムが動作し、計算を行います。

しかし、昨日の会話で、ブール代数を学ばなければ、私のコードは論理不在になってしまうという考えに至った。

もし、私のコードがブーリアンロジックを欠いていたら、私のプログラムは正しく動作しないか、全く動作しないでしょう。

しかし、昨日ちらっとWikipediaを見て、ブール代数とおそらく論理学は私の頭には合わないのだと悟りました

昨日、あなたは私のコードの断片をざっと見ただけで、それがブール論理を欠いていることをすぐに推論しました。

もし差し支えなければ、この断片に論理性がないという結論に至る、あなたの推論の過程を説明していただけませんか。

理解できたら、次に進みます。理解できなければ......プログラミングは自分の能力を大きく超えるものだという結論になるのでしょう。

ありがとうございます。

if (ot==0)
if (Bid==Price)
if(((Open[1]-Close[1])>100*Point)&&((Open[1]-Close[1])<120*Point))
if(((High[1]-Open[1])>40*Point)&&((High[1]-Open[1])<60*Point))
if(((Close[1]-Low[1])>40*Point)&&((Close[1]-Low[1])<60*Point))

アンドレイ 悲劇的なことばかりじゃないんだ!理解したものを使えばいいんです!それ以外のことは、そのうちわかるようになりますよ

例えば、Kimの関数でストップによるクローズをチェックした後、追加の変数Lotsを導入し、2倍のロットで新しいポジションを開く前に次の行を書かなければなりません:Lots = Lot*2.0 and that's all!そして、2倍速が必要ない普通のLotを入れたんですね!

なぜ、単純なことに複雑なコードが必要なのですか?科学のために、誰にも理解できないように?一種の "盗作 "防止策!

 
borilunad:

アンドレイ 悲劇的なことばかりじゃないんだ!理解したものを使えばいいのですそれ以外のことは、そのうちわかるようになるさ

例えば、stopでcloseをチェックした後、Lotsという変数を追加し、2倍のロットで新しいポジションを持つ前に、次の行を書かなければなりません:Lots = Lot*2.0 and that's all!そして、2倍速が必要ない普通のLotを入れたんですね!

なぜ、単純なことに複雑なコードが必要なのですか?科学のために、誰にも理解できないように?一種の "盗作 "防止策!

ボリス! 励ましてくれてありがとう。 少しは落ち着いたよ...。

しかし、それでも私のコードには論理性がないと何度も指摘され、苦しんでいます。

そして何より腹立たしいのは、具体的に何を言っているのか理解できないことです。

コードにブール論理がないことが重要なようです。

しかし、その存在の有無はどうすればわかるのでしょうか?

Alexeyは、この断片が原因で問題が発生するかもしれないと教えてくれました(テスターは問題ないのですが)。

if (ot==0)

if (Bid==Price)
if(((Open[1]-Close[1])>100*Point)&&((Open[1]-Close[1])<120*Point))
if(((High[1]-Open[1])>40*Point)&&((High[1]-Open[1])<60*Point))

if(((Close[1]-Low[1])>40*Point)&&((Close[1]-Low[1])<60*Point))

コーディングミスの場合は、MetaEditorが教えてくれるか、Terminal Logが教えてくれるかのどちらかで、すべてがクリアになります。

そして、もし私がロジックを見逃していたら......どうやってそれを知ることができるのでしょう? 経験豊富な仲間からのヒントがあればこそです。

しかし、彼らに促されても、具体的に何がどうなっているのか理解できないのです。

ブール代数を勉強することは、私にとって非現実的なことです。

 

ブール代数のことは忘れて、二度と持ち出さないでください。

逸話があります。

ある精神科医の先生が精神病院を訪れ、院長先生に「患者さんが回復したか、まだ病気なのか、どうやって判断しているのか」と質問されたそうです。

- 浴槽に水を張り、縁にスプーン付きのティーカップを置き、患者さんに水を抜いてもらうのです。

- 患者が元気であれば、スプーンではなくカップを取ると考えなければならないのですか?

- 健康な人であれば、浴槽の栓を抜く。

* * *

コードでやろうとしている動作が合理的かどうか、自分で答えられるはずですし、そんなに難しい問題ではありません。

Open[1]-Close[1]は負数でも可。つまり、Close>Openの場合は1つのオプション、Close<Openの場合はもう1つのオプションがあります。あるいは、ローソクの向きに左右されないように、本体サイズを計算する必要があります。

 
solnce600:

ボリス!応援ありがとうございます。 少し落ち着きました...。

しかし、それでも私のコードにはロジックがないと何度も言われました。

そして、一番腹が立つのは、具体的に何を言っているのか理解できないことです。

コードにブール論理がないことが重要なようです。

しかし、あるかないかを知るにはどうしたらいいのでしょうか?

Alexeyは、この断片には存在しないので、この断片のせいで問題が発生するかもしれないと言いました(テスターは問題ないのですが)。

if (ot==0)

if (Bid==Price)
if(((Open[1]-Close[1])>100*Point)&&((Open[1]-Close[1])<120*Point))
if(((High[1]-Open[1])>40*Point)&&((High[1]-Open[1])<60*Point))

if(((Close[1]-Low[1])>40*Point)&&((Close[1]-Low[1])<60*Point))

コーディングにミスがあった場合、MetaEditorが教えてくれるか、Terminal Logが教えてくれるかのどちらかで、すべてがクリアになります。

しかし、もし私がロジックを見逃していたら、どうやってそれを知ることができるでしょうか? 経験豊富な同僚からのヒントがあればいいのです。

しかし、彼らに促されても、私は何を言っているのか理解できない。

ブール代数を学ぶことは、私にとって非現実的なことです。

"まず、あなたのコードを読みやすくします。不要な括弧や条件を削除します。そして、なぜその条件が必要なのかを教えてください!

if (ot==0)                    //если Buy, значит эти условия для закрытия или модификации?!

if (Bid==Price)               //это не будет работать на Реале! 
                              //Надо так: (Bid>=Price) или (Bid<=Price) в зависимости от направления
if(Open[1]-Close[1]>100*Point && Open[1]-Close[1]<120*Point)
if(High[1]-Open[1]>40*Point && High[1]-Open[1]<60*Point)  

if(Close[1]-Low[1]>40*Point && Close[1]-Low[1])<60*Point) 

 
borilunad:

"まず、私があなたのコードを読みやすくします。不要な括弧や不要な条件を削除します。そして、なぜその条件が必要なのかを教えてください!

なぜ、このような不要な条件が必要なのかを話しているのです。

炉に送った条件が必要なので、プログラムは1ポイントのギャップでキャンドルの具体的なパラメータを計算します。

I.e.そのボディの特定のサイズの弱気のローソク足で、安値と終値の 間の距離の特定のサイズで、開いている。

この目的のために、私の記憶違いでなければ、NormalizeDouble (MathAbs ()) も使えると理解していますが、このバリアントとの差は感じられませんでした。

 
solnce600:

その余分な条件が必要だと言っているのです。

あなたが炉に私を送った条件、私はキャンドル+、- 1点の特定のパラメータを計算するためのプログラムが必要です。

すなわち、始値と終値の間の距離が特定の大きさで、その本体の大きさが特定の大きさの弱気ローソク足です。

この目的のためには、私の勘違いでなければ、NormalizeDouble(MathAbs())も使えると理解していますが、このバージョンとの差は気にしませんでした。

では、上記をご覧ください!修正しました。
 
Integer:

ブール代数のことは忘れて、二度と持ち出さないでください。

逸話があります。

ある精神科医が精神科病院を訪れ、院長に「患者が回復したのか、まだ病気なのか、どうやって判断しているのですか?

- 浴槽に水を張り、縁にスプーン付きのティーカップを置き、患者さんに水を抜いてもらうのです。

- 患者が元気であれば、スプーンではなくカップを取ると考えなければならないのですか?

- 患者が健康であれば、浴槽の栓を抜く。

* * *

コードでやろうとしている動作が合理的かどうか、自分で答えられるはずですし、そんなに難しい問題ではありません。

Open[1]-Close[1]は負数でも可。つまり、Close>Openの場合は1つのオプション、Close<Openの場合はもう1つのオプションがあります。あるいは、ローソクの向きに左右されないように本体サイズを計算する必要があります。

逸話をありがとうございます...これからはプラグのことだけを考えるようにします。

しかし、同じことが......このブランチから評判の良い人々が繰り返し、同時に私のコードに論理の不在について言うとき......それは後でブール代数判明したように - それはこのブランチからの深刻な専門家の権威に唾することを意味します... 私はすぐにそれに上昇しません...と全く上昇しないかもしれない......私はまだ試していません。

 
borilunad:
では、上記をご覧ください!修正しました。

だから、余計に括弧が多かったのか?害はないのか!

まあ、この括弧を入力してもコンパイラがエラーを出さなければ......すべてOKだと思っていたのだが。

最近まで、コンパイラが文句を言わず、Strategy Testerでコード通りにEAが動けばOKだと思っていました。

ちょっと違うようですが......。

 
solnce600:

ボリス! 応援ありがとうございます。 少し落ち着きました...。

しかし、それでも私のコードにはロジックがないと何度も言われました。

そして、一番腹が立つのは、具体的に何を言っているのか理解できないことです。

コードにブール論理がないことが重要なようです。

しかし、あるかないかを知るにはどうしたらいいのでしょうか?

Alexeyは、この断片には存在しないので、この断片のせいで問題が発生するかもしれないと言いました(テスターは問題ないのですが)。

if (ot==0)

if (Bid==Price)
if(((Open[1]-Close[1])>100*Point)&&((Open[1]-Close[1])<120*Point))
if(((High[1]-Open[1])>40*Point)&&((High[1]-Open[1])<60*Point))

if(((Close[1]-Low[1])>40*Point)&&((Close[1]-Low[1])<60*Point))

コーディングにミスがあった場合、MetaEditorが教えてくれるか、Terminal Logが教えてくれるかのどちらかで、すべてがクリアになります。

しかし、もし私がロジックを見逃していたら、どうやってそれを知ることができるでしょうか? 経験豊富な同僚からのヒントがあればいいのです。

しかし、彼らに促されても、私は何を言っているのか理解できない。

ブール代数を勉強することは、私にとって非現実的なことです。


ブール代数の専門家でなくても、用語を明確に述べれば...。

もう少し簡単に説明すると...。ifは 通常のifにelseは otherwiseに &&は andに ||は orに 置き換えるなど。そして、書かれていることを自分の普通の言葉で読んだり、書きたいことを決めたりすることができるようになるのです。

書いてあること(条件の誤記はとりあえず省こう)

1. if (ot==0) 成行注文がない場合(成行注文も保留注文も、このEAや他のEA、手動で開いたものもない)...。イエスなら2行目が実行され、ノーなら3行目に進みます。

2. if (Bid==Price) 価格が現在のローソク足の始値と等しい場合...であれば3行目が実行され、そうでなければ4行目に進みます。

3. if(((Open[1]-Close[1])>100*Point)&&((Open[1]-Close[1])<120*Point))最初のローソク足の始値が終値より100ポイント以上、120ポイント未満高い場合...ある場合は4行目へ、ない場合は5行目へ。

4. if(((High[1]-Open[1])>40*Point)&&((High[1]-Open[1])<60*Point))最初のローソク足の高値が、最初のローソク足の始値より40ポイント以上60ポイント未満高い場合・・・。もしそうなら5行目を実行し、そうでなければ6行目に進みます。

5. if(((Close[1]-Low[1])>40*Point)&&((Close[1]-Low[1])<60*Point))最初のローソク足の終値が、最初のローソク足の安値より40ポイント以上、60ポイント未満高い場合。であれば6行目を実行し、でなければ7行目に進みます。

6.

7.

この分解からわかるように、すべてのコード行を次々に実行させるか(各行がtrueを返す場合)、falseを返す行の後に来る行をスキップするか、どちらかになります。

用語の混乱を避け、正しく論理を構成するために、真理値の 後に実行されるべき1行でも、ブロック全体でも、すべての文を中括弧で囲みます。

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

if (ot==0) {
   if (Bid==Price) {
      // сюда можно вписать целый блок, который будет исполняться лишь при одном условии, что bid==Price
      // только вот вряд ли он когда-либо исполнится в реале
      }
   }
そこで、コードを構成要素に分解し、この場合不要な余分なブラケットを削除してみると......。