[ARCHIVE]フォーラムを乱立させないために、どんなルーキーの質問でも。プロフェッショナルの皆さん、通り過ぎないでください。あなたなしではどこにも行けない - 5. - ページ 304

 
Chiripaha:

:))))))))そうですね~、その通りです。すべての非難を受け付けます- その点については、改めてお詫び申し上げます。- 強く開発された(特殊な演習による)結果が全てです。

創造的、想像的、詩的な側面など、すべて同じです。人間には、創造的な半球と理性的な半球の2つがあります。私の落ち度は、それを見て訂正しなかったことです。

だから、あなたの主張はすべて的を射ていて、私は有罪なのです。

しかし、その疑問だけは解決されないまま...。

最終的にどう解決するか?

私が聞いていないと思うことがあれば、はっきり言ってください。フィードバック技術は(「聞こえる」ようになるための)理解できるが、解決策はまだ見えていない。

Ask = 1,20667 のような場合、Double では小数点以下3桁まで丸めずに正しい数値を得るにはどうしたらよいでしょうか。- StrToDouble(DoubleToStr(Ask,3))" のような解法。= 1,2100 // 1,2100が結果(=四捨五入)」となってしまい、うまくいきませんでした。

ご理解とご容赦をお願いいたします。

DoubleToStr(Ask,3)!!!!!!!!!!!!!!!!!!!!!!!?- それはそれで見ごたえがありましたね。

そして、その解決策はファイルの中にあります(テストスクリプトです)。

ファイル:
test_ind.mq4  2 kb
 
alsu:

あなたのコードを見てみると...。混乱しすぎです))))

現在のバーのパラメータ(6つの数値TOHLCV)をメモリに保存し、ティック受信時に必要に応じて更新し、与えられた条件(TimeCurrent()-O>1)でバーをカットオフさせるだけで十分だからです。

この方法でコードを作り直すと、8倍になることを保証します(確認済み:)。


こんな感じ?アルゴリズムの見直し、アキュムレータの削除、Expert Advisorへの変換、ティックの弱気・強気のグラデーション追加、別アルゴリズムによるローソク足のテール追加、全てコメント化しました。週末はダニがいないので、確認するものがないんです。ボリュームについては、私には、それがFileFlushに あった、それはバッファで動作するようです。今後のために、FileSeekとFileFlushの間には何も入れないようにします...。
ファイル:
elz.jp.mq4  23 kb
 
IgRU4ek:

DoubleToStr(Ask,3)!!!!!!!!!!!!!!!!!!!!!!!?- これは見るべきでした。

そして、その解決策はファイルの中にあります(テストスクリプトです)。


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

なぜ私のバージョンではうまくいかなかったのか、なぜ「DoubleToStr(Ask,3) != DoubleToStr(Ask,Digits) 」なのか、いまだにそのメカニズムが理解できません。 どうやら、関数のすべての機能が参考書に開示されているわけではないらしいのです。

あなたの関数が解析される-その方法が理解できました。でも、もっと「シンプルな」解決方法があるはずだと思ったのです。なぜなら、プログラミング言語の関数群は、ユーザーごとにその典型的な関数を自分で作るのではなく、関数を使って典型的な問題を解決するために設計されているからです。DoubleToStr()がちょうどこの問題を解決してくれると素朴に思っていたのです。- それじゃあ使う意味がない(どういうニュアンスなのか)。そんな細部にまでこだわる」のは、プログラマーではなく、普通のユーザーです。この場合、細かいプログラミングに時間を割くのであれば、クリエーション製品を使うべきでしょう。

いつもありがとうございます。これから、コードに落とし込んでいこうと思います。うまくいけば、すべてうまくいく。

 
Chiripaha:

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

なぜ私のバージョンではうまくいかなかったのか、なぜ「DoubleToStr(Ask,3) != DoubleToStr(Ask,Digits) 」なのか、そのメカニズムはまだ理解していません。どうも、関数のすべての機能が参考図書で開示されているわけではないらしいのです。

あなたの関数が解析される-その方法が理解できました。でも、もっと「シンプルな」解決方法があるはずだと思ったのです。なぜなら、プログラミング言語の関数群は、ユーザーごとにその典型的な関数を自分で作るのではなく、関数を使って典型的な問題を解決するために設計されているからです。DoubleToStr()がちょうどこの問題を解決してくれると素朴に思っていたのです。- それじゃあ使う意味がない(どういうニュアンスなのか)。そんな細部にまでこだわる」のは、プログラマーではなく、普通のユーザーです。この場合、細かいプログラミングに時間を割くのであれば、クリエーション製品を使うべきでしょう。

いつもありがとうございます。これから、コードに落とし込んでいこうと思います。うまくいけば、すべてうまくいく。

DoubleToStr()は、数値による変換を2段階で行います。まず、数値を(数学の規則に従って)丸め、正しい符号に変換した後、文字列に変換します。
 

あなたのケースを試してみてください

double x =MathFloor(y*1000)/1000;

 
IgRU4ek:
DoubleToStr()は、2つのステップで数値への変換を行います。まず、(数学的な規則によって)数値を正しい符号に丸め、次に文字列への変換を行います。


分かりやすい説明ありがとうございます。もちろん私はそれを知らず、今回の件でStrToDouble()のせいにしていました。しかし、あなたの説明を受けて、私は今、両方とも四捨五入していると仮定します :(

なぜ四捨五入なのかは不明です。丸めが必要な場合は、この場合、まず、何らかの丸め関数(必要に応じて)-同じ正規化-を使うのがよいでしょう。そうすると、四捨五入がある場合とない場合の両方の可能性が出てきます。そうでないと、余計にごちゃごちゃしてしまいますから。しかも、既存の数値を別の型にするだけなのに、なぜ丸くなるのか理解できない。もう(数字が)出ているのに、なんで追加で作らなきゃいけないんだ。

 
Roger:

あなたのケースを試してみてください

double x = MathFloor(y*1000)/1000;


そのとおりです。素敵なソリューションです。以前にも見たことがあるが、私の場合は何か見落としていた。アレクサンダーさん、こちらこそ、ありがとうございました。- これで2つの解決策を手に入れることができました。: ))(漫画「プロストクヴァシノ」に対して)
 

そんな理論的な問いかけ。終値は ティック単位で、ローソク足の最後のティックのビッドかアスクか?Close[0]にbidが書かれていると、ランナーでの気配値が分足と同じになることに気がつきました。

考えてみると...。アイデアで入札...

 
Zhunko:
エラーが多い。例を見て、類推してやるのがいいのでは?


基本的には同じものです。チュートリアルには全く書かれていませんが、私の理解では、Expert Advisor とライブラリの間のリンクとしてのみインクルージョンが必要だと思います。

インラインでインポートされる関数を宣言します。宣言の間に. 記号を入れるんですね。

ここでは、inludeとライブラリ(1つの関数だけですが、テスト用です)を書きました。

収録内容はこちらです。

//+------------------------------------------------------------------+
//|                                       HozIncludeToScalper_M1.mqh |
//|                                                              hoz |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "hoz"
#property link      ""

#import "Scalper_M1_lbr.ex4"

//+-------------------------------------------------------------------------------------+
//| Получаем машку с заданными параметрами                                              |
//+-------------------------------------------------------------------------------------+
double GetMA(int typeOfMA);

// Очередная функция

// Очередная функция

// Очередная функция

#import

必要な(特定のowlが使う)関数がすべて宣言されたら、最後に#importを つける。

こちらがライブラリー本体です。

//+-------------------------------------------------------------------------------------+
//|                                                                  Scalper_M1_lbr.mq4 |
//|                                                                                 hoz |
//|                                                                                     |
//+-------------------------------------------------------------------------------------+
#property copyright "hoz"
#property link      ""
#property library

//+-------------------------------------------------------------------------------------+
//| Получаем машку с заданными параметрами                                              |
//+-------------------------------------------------------------------------------------+
double GetMA(int typeOfMA)
{
   switch (typeOfMA)
   {
      case 1:      return (iMA(NULL, i_fastMATF, i_fastMAPeriod, i_fastMAShift, i_fastMAMethod, i_fastMAApplied, i_fastMAIndex));
      case 2:      return (iMA(NULL, i_slowMATF, i_slowMAPeriod, i_slowMAShift, i_slowMAMethod, i_slowMAApplied, i_slowMAIndex));
      case 3:      return (iMA(NULL, i_filtrMATF, i_filtrMAPeriod, i_filtrMAShift, i_filtrMAMethod, i_filtrMAApplied, i_filtrMAIndex));
   }
}

コンパイルもできない。

'i_fastMATF' - variable not defined     E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 38)
'i_fastMAPeriod' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 50)
'i_fastMAShift' - variable not defined  E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 66)
'i_fastMAMethod' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 81)
'i_fastMAApplied' - variable not defined        E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 97)
'i_fastMAIndex' - variable not defined  E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (17, 114)
'i_slowMATF' - variable not defined     E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 38)
'i_slowMAPeriod' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 50)
'i_slowMAShift' - variable not defined  E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 66)
'i_slowMAMethod' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 81)
'i_slowMAApplied' - variable not defined        E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 97)
'i_slowMAIndex' - variable not defined  E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (18, 114)
'i_filtrMATF' - variable not defined    E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 38)
'i_filtrMAPeriod' - variable not defined        E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 51)
'i_filtrMAShift' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 68)
'i_filtrMAMethod' - variable not defined        E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 84)
'i_filtrMAApplied' - variable not defined       E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 101)
'i_filtrMAIndex' - variable not defined E:\Insall'd soft's\Forex\MetaTraderForProgramming\experts\libraries\Scalper_M1_lbr.mq4 (19, 119)
18 ошибок, 0 предупреждений     

ライブラリでは何も宣言しないし、エラーも出ないのに、なぜか宣言してしまう。特に違いは感じられませんでした。

 

Victorさん、関数内にたくさんの変数がありますが、何も宣言されていませんね。

とコンパイラーは言った。

変数未定義

変数が定義されていない。その数、18人。

==============

機能のデザインから判断して、専門性の高い機能である。なぜ図書館に置くのか?特に、おそらくすべてのバーでループの中で呼び出されるでしょうから。

スピードと最適化について、何か言っていましたね。非常に遅いコードを作っていることになります。MQL4では、関数をループの中に入れてはいけません。ループ内の関数呼び出しが少なければ少ないほど、コードの実行速度は向上します。

==============

昔、私がMQL4で書き始めた頃、初めてFXの指標を 書きました。そこには関数もあり、文字列を使った演算もあり...。なんということでしょう・・・。TFの切り替えに5分かかりました。

そこで、腰を据えて考え、すべての関数を排除し、ループブロックの中で右開きにしたのです。文字列を扱う作業をなくし、識別子に置き換えた。事前に計算できるもの、変わらないものはすべて、そうやって計算(最適化)しました。Expert Advisorにコードを移動しました。その結果、TF切り替え時の最も重い計算が15秒となった。そして、その計算をDLLに移したのです。今は5秒くらいで終わります。