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

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

すみません-実はそのような点がある私の他のストッホを見ていたのです。最初の投稿への回答で提案されたものはOKでした。ありがとうございます。

 

ひとつだけアドバイス。

ブリック」(関数、スニペット、コードの一部)があって、それが問題なく動作する場合、それを変更しないことです。関数の良さは、入力を変更できることと、入力に応じて動作することです。そして、一度あらゆる場面で関数をテストしてしまえば、それが問題なく動くかどうかを考える必要はありません。そうすれば、エラーを探すときに見なければならないコードを絞り込むことができる(開発時間を大幅に短縮できる)。

crsnape@btinternet.com:
こんにちは、mladenさん 完全にあなたに同意します、あなたが提供したGetLots関数は、当然のように動作します。

私が変更したのは、単純に勝ち負けによってリスクペランタを変えたいからです。基本的には、既存のコードを改良し、資金管理のルールを追加しました(または、とにかくそうしようとしました)。

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

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

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

このフォーラムは、あなたがいなければ成り立たないものです。

ありがとうございます :-)
 

よくわからないのが、関数 ブラケットとその中に入れるものです。

関数の中に関数を書く場合、この関数名を括弧の中に入れる必要があるのでしょうか?

例えば、LastOpenTicket()という関数があり、これがGetLotsという関数の中で呼ばれる場合、LastOpenTicket()を括弧の中に入れて、GetLots (LastOpenTicket()) のようにする必要がありますか?

また、()の中も必要ですか?LastOpenTicket (int number, int digit, int anotherone) の場合はどうでしょうか。この場合、GetLots という関数のブラケットに、例えば GetLots (int number, int digit, int anotherone... と関数内の他の変数など) のようにすべて記述するのでしょうか?

 

...

1.1. {}括弧のペアを "開始 "と "終了 "として想像してください。

2.mqlではネストした関数を書くことはできません(パスカルでは可能ですが、mqlではできません - ネストした関数は、他の関数のボディの中に関数を宣言することになります。ネストされた関数は、他の関数本体の中で関数を宣言することになります。)2.コードのどの部分でも、任意の関数を呼び出すことができます。

3. 呼び出しの形式(例のGetLots (LastOpenTicket())のような直接呼び出し)、またはLastOpenTicket()の戻り値を何らかの変数に代入し、それをGetLots()の呼び出しの引数とすることができる。

crsnape@btinternet.com:
関数の括弧とその中に入るものについて、よくわからないことがあります。

関数の中に関数を書く場合、その関数名を括弧の中に入れる必要がありますか?

例えば、LastOpenTicket()という関数があり、これがGetLotsという関数の中で呼ばれる場合、GetLots (LastOpenTicket()) のように、LastOpenTicket()を大括弧の中に入れる必要があるのでしょうか。

また、()も必要なのでしょうか?例えば、LastOpenTicket (int number, int digit, int anotherone)の場合、GetLots (int number, int digit, int anotherone... and any other variables in the function etc.)のように、この例ではすべて関数 GetLots Bracket に入れるのでしょうか?
 

この2つの違いは何でしょうか?何かあるのでしょうか?

double GetLots (int number, int call, int specialcall, int order)

{

とします。

double GetLots ()

{

int number;

int call

int specialcall;

int order;

?

 

...

1つ目は、引数を受け取る関数です。

2番目は引数を持たない関数で、関数本体の外では "number", "call", "specialcall", "order" の値を変更することができません。

関数の宣言に関するより有用な情報は、このスレッドで見ることができます :https://www.mql5.com/en/forum/173005

crsnape@btinternet.com:
これらの2つの違いは何ですか?何かあるのでしょうか?

double GetLots (int number, int call, int specialcall, int order)

{

と...

double GetLots ()

{

int number;

int call

int specialcall;

int order。

?
 

ここ数日、関数で 遊んでいるのですが、まだ空白の結果が出ています。文字通り、髪を引き裂かれそうです。

私はあなたが提案したようにRiskSizeを計算するように関数を変更し、(私はそれが今ではより良いシステムであることに同意する)私のGetLots関数でそれを使用しました。これがそれです。

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

double GetLotsLong (double SLDistanceLong)

{

RefreshRates();

double MinLots, MaxLots, LotStep;

double LotsLong = 0;

int LotDigit = 2;

int Risk = GetRiskLong (RiskLong);

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 (AccountBalance() > AccountFreeMargin())

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

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

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

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

return (LotsLong);

}

また、RiskLongという変数が定義されていないことも不満です。しかし、これは関数GetRiskLongの下で定義されており、それを呼び出しています。

もし、投稿したコードだけでは難しいのであれば、それを送ることができますか?

 

...

まず第一に、ロングとショートに別々のロットを作成する必要はありません。一つの関数(すでに提供されているもの)を両方の注文に使ってください(ロットサイズの計算はショートとロングで全く同じでなければなりません)異なる計算をしたい場合は、リスクまたはストップロスの 距離を変更するだけです。

このエラーは、関数内で宣言された変数が、関数内でのみ「見える」ために発生します。あなたが指示した名前の変数を持つ関数を呼び出していることは重要ではありません:それは呼び出された関数のみにローカルであり、コードの他の部分はそれについて「知らない」ので、アクセスできません。

crsnape@btinternet.com:
ここ数日、私の関数で遊びまわっていますが、まだ空白の結果を得ています。私は文字通り髪を引き裂かれそうです。

私は、あなたが提案したようにRiskSizeを計算するように関数を変更し、私のGetLots関数でそれを使用しました(私は今、より良いシステムであると同意します)。これがそれです。

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

double GetLotsLong (double SLDistanceLong)

{

RefreshRates();

double MinLots, MaxLots, LotStep;

double LotsLong = 0;

int LotDigit = 2;

int Risk = GetRiskLong (RiskLong);

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 (AccountBalance() > AccountFreeMargin())

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

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

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

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

return (LotsLong);

}

また、RiskLongという変数が定義されていないことも不満です。しかし、これは関数GetRiskLongの下で定義されており、それを呼び出しています。

もし、掲載したコードだけでは難しいようでしたら、お送りすることは可能でしょうか?
 
mladen:
まず、引数を受け取る関数です。

2番目は引数のない関数なので、関数本体の外で「番号」「コール」「スペシャルコール」「オーダー」の値を変更することはできません

関数の宣言に関するより有用な情報は、このスレッドで見つけることができます :https://www.mql5.com/en/forum/173005

これはありがとうございます。では、GetLotsという関数内からGetRiskという関数を呼び出す場合、GetLotsという関数の外側で値を計算しているので、GetLotsの括弧(...)内にGetRiskという関数の変数を入れる必要があるのですね。

 

...

この方法でやってみます。

2つの質問(口座の現在の$の状態がわかっていると仮定して) :

question 1 : 私は(わからない)%のリスクと(わからない)pipsの損切りをするつもりです。ロットサイズはどうすればいいでしょうか?

質問2 : 私は1%のリスクと100 pipsのストップロスを負うつもりです。ロットサイズはどうすればいいですか?

1つ目の質問に対する回答が不可能であることは明らかです。なぜなら、私がどの程度のリスクを負うのか、またどの程度の損切りをするのかが分からないからです。しかし、2番目の例では、これらすべてを知っているので、ロットサイズを計算することは可能です。rsik%とストップロスは変動することが予想されるので、ロットサイズの計算には、関数が呼び出されたときに毎回関数に「伝える」ことになる変数引数として、これらの引数を提供します。

これで、関数の引数(パラメータ)が何のためにあるのかが明らかになったかと思います。どの関数も同じ原理で動作します。もし計算のある部分が壊れる可能性があると予測したら、それを関数の引数として与えます。

以下は、関数のコーディングの例です :https://en.wikipedia.org/wiki/Function_%28computer_science%29

crsnape@btinternet.com:
このためにありがとうございます。GetLotsという関数の中からGetRiskという関数を呼び出す場合、GetLotsという関数の外で値を計算しているので、GetLotsの括弧(...)内にGetRiskという関数の変数を入れる必要があるということでしょうか?