コーディングの方法は? - ページ 304

 

...

1.一般的には、移動平均が「安定」するために必要な数よりもはるかに多くのバーを持っていることがほとんどなので、それをチェックする意味がありません。これは古いバグではなく、履歴の中にいくつのバーがあるかという単純なチェックです。

2.はい。ただ、iClose() (同様の iOpen(), iHigh(), iLow()) は関数で、Close[], Open, High[], Low[] は配列で、値へのアクセスが非常に速いので、配列の 速度と単純さよりも関数の柔軟性が本当に必要かを考える必要があることを心に留めておいてください。

zzz:
こんにちは、私はプログラミングには新しいですが、取引には新しくないです。しばらく投稿していなかったのですが、EAを開発し始めてから、たくさんの質問があります。まず、インジケータを作ることから始め、それが私の望むものを作ることができたら、もっと先に進みます。マニュアルは全て読みましたので、いよいよコーディングに取り掛かります。

申し訳ありませんが、間違ったスレッドであれば、私がそのような質問を投稿すべき場所を教えてください。

とりあえず2つほど、おそらく基本的な質問がありますので、お願いします。

1.MAを使用する多くの指標で、チャート上にいくつのバーがあるかをチェックする行を見ます。MA200が必要で、チャートが例えば100本しかない場合、iMA200は機能するのでしょうか?確認したところ、どのMAもどのチャートでも問題なく描画されたので、これは古いバグで、現在Metaquotesが修正したものと思われます。ということは、MAを描画したり、iMA関数を使うために、チャートに何本バーがあるか確認する意味はあるのでしょうか?

2.2.CloseとiCloseの違いは何ですか?私の理解では、Closeは現在のチャート上のバーの終値のみを返し、iCloseはどの通貨ペア、どの時間枠の終値も返すことができます。どちらの場合も、最後に閉じたバーを取得するためには、インデックス[1]を使用する必要があります。私の理解は正しいでしょうか?

ありがとうございました。
 

MT4用ダブルストキャスティクス、リアルダブルストキャスティクス

こんにちは、新しいMT4ユーザーです。

MT4用のDoubleStochasticインジケータを探すのに苦労しています。VTTプラットフォームでお気に入りのインディケータでした。そして、私は本物のダブルストキャスティックを意味します - オリジナルのダブルストキャスティックとは全く異なる表示をするブレッサートダブルストキャスティックでは ありません。添付ファイルをご覧ください - VTTからのDoubleは、MT4からのDoubleとは少し異なる表示をします。

どなたか、VTT'2 DoubleStochasticをMT4にコード化するのを手伝っていただけませんか?以下はVTTのコードとロジックです。

Fast %K = ((今日の終値 - %K ピリオドの最安値) / (%K ピリオドの最高値 - %K ピリオドの最安値))* 100

スローイング%K = ファスト%KのN期間移動平均

ダブル%K = ((今日のスローイング%K - %K期間の最安値スローイング%K) / (%K期間の最高値スローイング%K - %K期間の最安値スローイング%K))* 100

ダブルスローイング%K = ダブル%KのN期間移動平均

D = 2倍速%Kの3期間単純移動平均

と、コードそのものです。

St:= Mov(((C-LLV(L,K))/(HHV(H,K)-LLV(L,K)))*100,Sl,Mt).DSt:= Mov((C-LLV(L,K))*100,Sl,Mt);

DSt:= Mov((St-LLV(St,K))/(HHV(St,K)-LLV(St,K)))*100,Sl,Mt);

DStD:= Mov(DSt,D,MtD)。

MT4が得意な方いらっしゃいますか?

VTTのバージョンに慣れてしまって、他のが使えません。

 

...

gmailer

ダブルストキャスティックをここに投稿しました :https://www.mql5.com/en/forum/177239/page28(ストキャスティックの全バージョンを一箇所に集めるため)

お探しのものだと思います。

gmailer:
こんにちは、皆さん - 新しいMT4ユーザーです。

MT4用のDoubleStochasticインジケータを探すのに苦労しています。VTTのプラットフォームで一番好きなインジケーターでした。そして、私は本物のダブルストキャスティックを意味します - オリジナルのダブルストキャスティックとは全く異なる表示をするブレッサートダブルストキャスティックのことではありません。添付ファイルをご覧ください - VTTからのDoubleは、MT4からのDoubleとは少し異なる表示をします。

どなたか、VTT'2 DoubleStochasticをMT4にコード化するのを手伝っていただけませんか?以下はVTTのコードとロジックです。

Fast %K = ((今日の終値 - %K ピリオドの最安値) / (%K ピリオドの最高値 - %K ピリオドの最安値))* 100

スローイング%K = ファスト%KのN期間移動平均

ダブル%K = ((今日のスローイング%K - %K期間の最安値スローイング%K) / (%K期間の最高値スローイング%K - %K期間の最安値スローイング%K))* 100

ダブルスローイング%K = ダブル%KのN期間移動平均

D = 2倍速%Kの3期間単純移動平均

と、コードそのものです。

St:= Mov(((C-LLV(L,K))/(HHV(H,K)-LLV(L,K)))*100,Sl,Mt).DSt:= Mov((C-LLV(L,K))*100,Sl,Mt);

DSt:= Mov((St-LLV(St,K))/(HHV(St,K)-LLV(St,K)))*100,Sl,Mt);

DStD:= Mov(DSt,D,MtD)。

MT4が得意な方いらっしゃいますか?

VTTのバージョンに慣れてしまったので、他は使えません。
 

^ ありがとうございます - それはそうかもしれません。ボトムとトップにある「緑とピンクのポイント」を取り除く方法をご存知ですか?

 

mladenさん、ありがとうございます。

 

皆さん、こんにちは。

ストキャスティクスの ラインがoverbrought(80)またはoversold(20)の領域で交差したときに取引を開始する方法を見つけるのに苦労しています。ストキャスティクスのラインがクロスしたときに取引を開始することはできますが、オーバーブロットまたはオーバーソールドの領域にあるときのみ取引を開始するように設定することができません。どなたか、これを行う方法についてご存知の方、または私が参照することができる他の場所がありますか?

20.1や80.1といった値を設定するようなサイトもありましたが、それ以上のことはわかりません。

何かヒントを与えてください。ありがとうございました。

ありがとうございます。

テランス

 

...

Terranceです。

このスレッドには、あなたが必要とするものの例として使用できるいくつかの実用的なコードがあります。https://www.mql5.com/en/forum/179114

tkuan77:
こんにちは、皆さん。

ストキャスティクスのラインがoverbrought(80)またはoversold(20)の領域内でクロスしたときに取引を開始する方法を見つけるのに苦労しています。ラインがクロスした時に取引を開始することはできますが、オーバーブロットまたはオーバーソールドの領域にある時のみ取引を開始するように設定することができません。どなたか、これを行う方法についてご存知の方、または私が参照することができる他の場所があるでしょうか?

20.1や80.1といった値を設定するようなサイトもありましたが、それ以上のことはわかりません。

何かヒントを与えてください。ありがとうございました。

お問い合わせ先

テランス
 

こんにちは、私は機能を修正し、今では満足しています。見た目はいい感じです。しかし、バックテスト 時の取引結果ログには買い注文が1つしか含まれていません。私はそれが私のGetLots関数に関係しているかもしれないと思うが、私はそれを何度も見てみたが100%ではありません - あなたはそれに目を配り、あなたが何か正しくないものを見つけた場合は私に教えてもらえますか?ありがとうございます。

//--- ロングポジションのロットを計算する関数

double GetLotsLong (int LowRisk, int HighRisk, double SLDistanceLong, int LastOpenTicket, int LastTicket)

{

RefreshRates() を使用します。

double MinLots, MaxLots, LotStep;

int LotDigit = 2;

double LotsLong = 0;

MinLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MINLOT), 2); // LotStepに対応するため、Lotsを正規化する必要があります。

MaxLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MAXLOT), 2); // 正規化は丸めずに、LotStepより大きいロットの部分を切り捨てます。

LotStep = NormalizeDouble(MarketInfo(Symbol(), MODE_LOTSTEP), 2); // このようにすると、リスクが少し小さくなる。

if (MarketInfo(Symbol(), MODE_DIGITS) == 3 || MarketInfo(Symbol(), MODE_DIGITS) == 5) SLDistanceLong *= 10.0;

if (LotStep == 1.00) LotDigit = 0;

if (LotStep == 0.10) LotDigit = 1; if (LotStep == 0.10) LotDigit = 1;

if (LotStep == 0.01) LotDigit = 2;

if (GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "W")

{

if (AccountBalance() > AccountFreeMargin())

LotsLong = NormalizeDouble(AccountFreeMargin() * (HighRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

else LotsLong = NormalizeDouble(AccountBalance() * (HighRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit).LotsLong = NormalizeDouble() * (HighRisk / 100) * MarketInfo (Symbol(), MODE_TICKVALUE), LotDigit);

}

LotsLong = NormalizeDouble(NormalizeDouble(LotsLong / LotStep, 0) * LotStep, LotDigit).LotsLongは、LotStepの値です。

LotsLong = MathMax(MathMin(LotsLong, MaxLots), MinLots);

return (LotsLong);

if (GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "L")

{

if (AccountBalance() > AccountFreeMargin())

LotsLong = NormalizeDouble(AccountFreeMargin() * (LowRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit).LotsLong = NormalizeMargin() * (LowRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE));

else LotsLong = NormalizeDouble(AccountBalance() * (LowRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit).LotsLong = NormalizeDouble() * (LowRisk / 100) * MarketInfo (Symbol(), MODE_TICKVALUE), LotDigit);

}

LotsLong = NormalizeDouble(NormalizeDouble(LotsLong / LotStep, 0) * LotStep, LotDigit).LotsLongは、LotStepの値です。

LotsLong = MathMax(MathMin(LotsLong, MaxLots), MinLots);

return (LotsLong);

}

 

...

私が投稿したフォームのGetLots()はテスト済みで、その通りに動作しています。変更する必要はありません。注文を開始した瞬間にロットサイズを決定する関数として使用してください。残りのロジックは除外してください(この関数は、リスク、ストップロス、現在の口座の 状態に応じて注文サイズを決定することだけを行うべきです)。

残りのコードがなければ、私はあなたを助けることができません。それは私が小さな穴から世界全体を見ているようなものです。不可能です。もしあなたが残りのコードを秘密にしたいのなら、私がお手伝いできるのはあなたがここに投稿したコードだけです。そして、繰り返しますが、本来の形のGetLots()は本来の形で動作し、本来の形で使用されるべきです。

もし、可変の結果でそれを使用したい場合は、リスクまたはストップロスのフィードを動的に変更してください(GetLots()の前のコードでリスクまたはストップロスを「決定」し、次にそれらの変更したリスクまたはストップロスでそれを呼び出します - 関数は与えられたletered入力に対して正しく計算します) 関数のコードを変更する必要はありません。

crsnape@btinternet.com:
こんにちは、私は関数を修正し、今それらに満足しています。見た目はいい感じです。しかし、バックテスト時の取引結果ログには買い注文が1つしかありません。私はそれが私のGetLots関数に関係しているかもしれないと思うが、私はそれを何度も見てみたが、100%ではありません - あなたはそれを見て、何か間違っていることを発見したら教えていただけますか?ありがとうございます。

//--- ロングポジションのロットを計算する関数

double GetLotsLong (int LowRisk, int HighRisk, double SLDistanceLong, int LastOpenTicket, int LastTicket)

{

RefreshRates() を使用します。

double MinLots, MaxLots, LotStep;

int LotDigit = 2;

double LotsLong = 0;

MinLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MINLOT), 2); // LotStepに対応するため、Lotsを正規化する必要があります。

MaxLots = NormalizeDouble(MarketInfo(Symbol(), MODE_MAXLOT), 2); // 正規化は丸めずに、LotStepより大きいロットの部分をカットします。

LotStep = NormalizeDouble(MarketInfo(Symbol(), MODE_LOTSTEP), 2); // このようにすると、リスクが少し小さくなる。

if (MarketInfo(Symbol(), MODE_DIGITS) == 3 || MarketInfo(Symbol(), MODE_DIGITS) == 5) SLDistanceLong *= 10.0;

if (LotStep == 1.00) LotDigit = 0;

if (LotStep == 0.10) LotDigit = 1; if (LotStep == 0.10) LotDigit = 1;

if (LotStep == 0.01) LotDigit = 2;

if (GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "W")

{

if (AccountBalance() > AccountFreeMargin())

LotsLong = NormalizeDouble(AccountFreeMargin() * (HighRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit);

else LotsLong = NormalizeDouble(AccountBalance() * (HighRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit).LotsLong = NormalizeDouble() * (HighRisk / 100) * MarketInfo (Symbol(), MODE_TICKVALUE), LotDigit);

}

LotsLong = NormalizeDouble(NormalizeDouble(LotsLong / LotStep, 0) * LotStep, LotDigit).LotsLongは、LotStepの値です。

LotsLong = MathMax(MathMin(LotsLong, MaxLots), MinLots);

return (LotsLong);

if (GetWinLossPreviousLong (LastOpenTicket, LastTicket, WinLossPreviousLong) == "L")

{

if (AccountBalance() > AccountFreeMargin())

LotsLong = NormalizeDouble(AccountFreeMargin() * (LowRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit).LotsLong = NormalizeMargin() * (LowRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE));

else LotsLong = NormalizeDouble(AccountBalance() * (LowRisk / 100) / (SLDistanceLong * MarketInfo (Symbol(), MODE_TICKVALUE)), LotDigit).LotsLong = NormalizeDouble() * (LowRisk / 100) * MarketInfo (Symbol(), MODE_TICKVALUE), LotDigit);

}

LotsLong = NormalizeDouble(NormalizeDouble(LotsLong / LotStep, 0) * LotStep, LotDigit).LotsLongは、LotStepの値です。

LotsLong = MathMax(MathMin(LotsLong, MaxLots), MinLots);

return (LotsLong);

}
 

こんにちは mladen 私はあなたに完全に同意する、あなたが提供したGetLots関数は、それが必要なように動作します;私は私のコードの一部としてそれをテストし、それが動作しました。

私は単に私が勝っているか負けているかによって私のリスクのperamterを変更したいので、それに変更を加えました。私は基本的に、既存のコードを改良し(あるいはとにかくそうしようとし)、追加の資金管理ルールを組み入れました。

正直に言うと、私のコードは秘密ではありません。私がやろうとしていることを他の多くの人が考え、コードに実装していると思いますが、私個人が開発に多くの時間を費やしたため、プライバシーという要素があると思います。

私はゼロから物事を学び、実行することに誇りを持っているので、問題があれば自分で解決しようと思っています。

しかし、私はあなたの最後の段落を理解しています。私は1つの'Risk'変数を使用し、関数の出力に応じてこのリスクを変更するつもりです。

このフォーラムは、正直言って、あなたなしでは成り立たないでしょう。

ありがとうございました。)