初心者の方からの質問 MQL5 MT5 MetaTrader 5 - ページ 574

 
Anton Balakirew:
買いまたはベアグリップシグナルで注文を開くという考え方ですが、売り買いの取引と注文待ちの 取引が1つずつしかないようにするには、私は取引の1ティックごとに1つずつ開いているのです。問題解決に貢献する。
新しいポジションを開く、または新しい保留注文を出す前に、設定されている注文の数と未決済のポジションの数を確認します。
 
Artyom Trishkin:

さて、ここでもう一つの方法として、マッチはレンジ内の各ローソク足に対して書き込まれます。以前のバージョンでは、マッチは1つのキャンドルに対してのみ書かれていました。つまり、このキャンドルとマッチするものは書かれていませんでした。

アルテム ありがとうございます。調べてみます。

pako:

高い値は丸めることができる。例えば、1.23456という値を1.2346に丸めることができる。


なるほど、そういうことだったのか。また、設定に変数を追加し、高さの値が等しいと見なす偏差を指定できるようにしました。4桁の引用符なら問題ないことが多いが、5桁の 引用符の場合、完全一致の検索が無限に可能だからだ。

 
Andrey Koldorkin:

アルテム ありがとうございます。調べてみるよ。

丸め方が明確です。また、設定に変数を入れて、Highの値が等しいと見なす偏差値を指定できるようにしました。4桁の引用符なら問題ないのですが、5桁の引用符の場合、完全一致を探すときりがないので必要なのです。

どういたしまして。第2版では、不正確な表現をしてしまいました。最初のバージョンでは、ループインデックスから次のローソク足からマッチを検索していたので、メインループのパスはローソク足の数から1を引いた数で、一番外側の2本のローソク足を比較するようになっていました。さて、2番目のバージョンでは、それぞれのローソク足について、全範囲で一致するものを検索します。

for(int i=0; i<copy_bars-1; i++) {                             // цикл по скопированным данным от начала до "на один меньше размера массива"

に変更する必要があります。

for(int i=0; i<copy_bars; i++) {                             // цикл по скопированным данным от начала до конца диапазона
 
Artyom Trishkin:
新しいポジションを開く、または新しい保留注文を出す前に、設定された注文の数と未決済のポジションの数を確認します。

つまり、取引条件の中に、注文 数やポジション数をチェックする条件を追加する必要があるのでは?

if (o4>c4&&o3>c3&&l2>l1&&c2<c1&&o2>c2&&o1<c1&&c1>o2&&h1>h2||o2>c1&h2>h1&h1<o2&o1<c1&&l2>l1&&o3>c3&&o4>c4){ //first condition

if (OrdersTotal()==0) //第二条件

OrderSend(Symbol(), OP_BUY,Lot,o,10,l1,0); }......................................................................................

また、オープンポジションの数をカウントするのはどの機能ですか?

問題を解決できたと思う。

if (Hour()>=0&Hour()<23){。

if (o4>c4&&o3>c3&&l2>l1&&c2<c1&&o2>c2&&o1<c1&&c1>o2&&h1>h2||o2>c1&&h2>h1&&h1<o2&&o1<c1&&l2>l1&&o3>c3&&o4>c4){

if (PositionsTotal()<=1))

OrderSend(Symbol(), OP_BUY,Lot,o,10,l1,0); }.//購入する

if (o4>c4&&o3>c3&&l2>l1&&c2<c1&&o2>c2&&o1<c1&&c1>o2&&h1>h2||o2>c1&&h2>h1&&h1<o2&&o1<c1&&l2>l1&&o3>c3&&o4>c4){

if (PositionsTotal()==1&OrderType()==0)

OrderSend(Symbol(), OP_SELLSTOP,Lot,l2,10,h2,0);}.//SellStop注文の延期

if (o4<c4&&o3<c3&&h2<h1&&c2>c1&&o2<c2&&o1>c1&&c1<o2&&l1<l2||o2<c1&&l2<l1&&l1>o2&&o1>c1&&h2<h1&&o3<c3&&o4<c4){

if (PositionsTotal()<=1))

OrderSend(Symbol(),OP_SELL,Lot,o,10,h1,0); }.//売り出し中

if (o4<c4&&o3<c3&&h2<h1&&c2>c1&&o2<c2&&o1>c1&&c1<o2&&l1<l2||o2<c1&&l2<l1&&l1>o2&&o1>c1&&h2<h1&&o3<c3&&o4<c4){

if (PositionsTotal()==1&OrderType()==1)

OrderSend(Symbol(), OP_BUYSTOP,Lot,h2,10,l2,0);}.//BuyStop注文の延期

}

//+------------------------------------------------------------------+

//オープンポジションの合計額を返す関数|FAQ|株式会社日立製作所

//|

//+------------------------------------------------------------------+

int PositionTotal() {

int pos = 0;

for (int i=0; i<OrdersTotal(); i++){

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if (OrderType() == OP_BUY || OrderType() == OP_SELL)

pos++です。

}

return(pos);

}

//+------------------------------------------------------------------+

 
Artyom Trishkin:

さて、ここでもう一つの方法として、マッチはレンジ内の各ローソク足に対して書き込まれます。以前のバージョンでは、マッチは1つのキャンドルに対してのみ書かれていました。つまり、このキャンドルとマッチするものは書かれていませんでした。

よかったです。しかし、私が見る限り、ローソク足2の高値とローソク足7の安値が一致すれば、2 <=> 7、7 <=> 2という2つのマッチが見つかります。また、逆ペアを考慮し、余計なループがない場合はどうでしょう?

ネストしたforループを使わずに、1パスで解決できないものでしょうか:)))?

 
Vasiliy Sokolov:

グッドです。しかし、私の理解では、ローソク足2の高値とローソク足7の高値が一致すれば、2 <=> 7、7 <=> 2となり、逆ペアを考慮しても、余分なループがなければ、どうでしょうか?

ネストしたforループを使わず、一気に解決するのはどうでしょう:)))?

:)弱い 私を演じようとしないでください;)もちろん、1つのループで解決できると思うのですが、あまり長く考えるのは億劫で、思いついたまま一気にやってしまいました。

当然ながら、ここではペアとなった複数のローソク足すべてが、各ローソク足のマッチングデータに記録される。それゆえ、相互に参照し合っているのです。何のためにあるのかわからないまま、バリエーションを提案しているだけなのです。

また、さらに計算の最適化という課題も解決できますが、私には必要ありません。

あなたは正確に各キャンドルとすべてのマッチのためのデータが必要な場合は、どのような場合は、どのような場合は、どのような場合は、...しかない

だから、時間もないし、欲もない。自分でコードを書く代わりに、時間を浪費してしまったのです。

SZYさん、必要な入力パラメータを把握した上で、コホネンメソッドを接続することも必要かもしれませんね。

 
Artyom Trishkin:

一般的には - 時間も欲もない。それで、自分でコードを書く代わりに時間を浪費してしまったのです。

残念です、本当に残念です。
 
Vasiliy Sokolov:
残念、残念。
まあ、たしかに面白い作業ではあるのだが、残念ながら時間がない。
 
Artyom Trishkin:

どういたしまして。第2版では、不正確な表現をしてしまいました。最初のバージョンでは、ループインデックスから次のローソク足からマッチングを探すため、メインループはローソク足の数から1を引いた数で渡され、一番外側の2本のローソク足を比較するようにしました。さて、2番目のバージョンでは、それぞれのローソク足について、全範囲で一致するものを検索します。

に変更する必要があります。

このセリフの意味を教えてください。

input int Search_Period=10; // コピーするローソク足の本数

int searchPeriod=(Search_Period<1)?1:Search_Period; // "?", ":" の記号は何を意味しているのでしょうか?

input int Delta=2; // 入室点数

int delta=(Delta<0)?0:Delta; // 記号 "?", ":" の意味は?

 
Andrey Koldorkin:

このセリフの意味を教えてください。

input Search_Period=10; // コピーするローソク足の本数

int searchPeriod=(Search_Period<1)?1:Search_Period; // 文字 "?", ":" の意味は?

input int Delta=2; // 入室点数

int delta=(Delta<0)?0:Delta; // 記号 "?", ":" の意味は?

// строку int searchPeriod=(Search_Period<1)?1:Search_Period;
// можно расписать так:

input int Search_Period=10; // Количество копируемых свечей ... эту строку вы видите в настройках
int searchPeriod;           // Сюда будем записывать входной параметр
if(Search_Period<1) searchPeriod=1; // Если во входном параметре ввели ноль или меньше нуля, то параметр будет равен единице
else searchPeriod=Search_Period;    // иначе примем входной параметр

// соответственно и строку int delta=(Delta<0)?0:Delta;
// можно расписать точно так же

参考資料より

条件演算子 ?

三項演算 子の一般的な形式は次のようになる。

expression1? expression2: expression3

最初のオペランドとして、expression1 には、bool 型の値を返す任意の式を指定できる。結果が であれば、第2オペランドで指定された演算子expression2が実行 される。

第1オペランドが 偽の 場合、第3オペランドであるexpressionZが 実行される。2番目と3番目のオペランド、すなわち "expression2 "と "expressionZ "は、同じ型の値を返さなければならず、void型であってはならない。条件演算子の実行結果は、"expression1 "の結果に応じて、"expression2 "の結果、または "expression3 "の結果となる。

//--- 始値と終値の差を日較差で再正規化する。

double true_range = (High==Low)?0:(Close-Open)/(High-Low);

このエントリーは、以下と同等です。

double_range。

if(High==Low)true_range=0;// HighとLowが等しい場合

else true_range=(Close-Open)/(High-Low);// Highが0でない場合

理由: