MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 196

 
Alexey Viktorov:

まあ、もうちょっと頑張って教育していこうと思います。

送るときの宛名は「あなた」にします。ポインターのスナップショットがあるのですが・・・。

教えてください。同じティックで同じ関数を5回呼び出すのはおかしいと思いませんか?しかし、それでは悩みが半減してしまいます。この機能は、すべての注文を調べます。しかも、これを1回で5回も...。そして、そのような機能は4つ数えることができます。1サイクルで全オーダーを検索するために、ループにあと3つの関数をどう組み込むか、十分に検討することはできません。

そのうちの2つをご紹介します。

これは

引き離すどころではありません。

これを理解するためには、トレーリングの定義を明確に理解する必要がある。一字一句覚えていませんが、おおよそ「起こりうる損失を減らすため、あるいは "保証された "利益を増やすために、価格に沿ってストップロスのレベルを移動させる」ということです。

そして、この

Expert Advisorを実行すると、どのように見えるのでしょうか?おそらく4行で...。は必要ですか?

そして、今日最後のことですが、頭の中に図書館がなくてもいいんです。ドキュメントがあって、使い方がわかっていれば十分です。iMA(_Symbol, _Period, ,,,,) の全てのパラメータをまだ覚えていないので、ドキュメントを勉強しないと先に進めません。というように、ほとんどすべての機能が幸いなことに、少し前にツールチップが作られましたが、これはあまり役に立ちません。この列挙の書き方、この列挙の書き方を暗記しようというのではありません。だから、いちいちドキュメントを見ないといけない。


Alexeyさん、情報ありがとうございます。はい、コードが最適でないことは認めます。私はプログラマーではないので、あなたが説明した微妙な点を知らないだけです。私は単にそのようなニュアンスを理解していない、私はそれをすべて最適化する方法を理解していない、多分私は後でそれを行うだろう、私が前進する場合。今、最適化を始めても、すべてを壊すだけだということがよくわかりました。私のホームページで他のEAのコードを見ましたが、本当にたくさんありますね。- 確かにプロのプログラマーであれば、彼のコードは私のよりも端末への負荷が低いのかもしれませんが、今のところ、私はプログラミングの最適化のニュアンスを本当に理解していないので、あなたのコメントを考慮することはできません。また、コード内の関数の呼び出しをいくつか削除すると、確かにExpert Advisorはそこでカオスを始め、必要のないときに注文を出すようになります。私はそこでコーディングし、テストしました。うまくいかないことも、間違ったことも、修正し、その結果、最終的なコードはこのようになりました。私の知識のお荷物でご理解いただけると思いますが、私には最適化のための時間がありませんでした。

トレーリングについては、利益をトレールすることが最も重要であり、現段階では満足しています))))もちろん、私はトレイリングが機能したという結論に達しましたが、トレイリングが機能するこの環境でどのように正しく行うかは誰も言及していませんし、私もそれについて何も考えていません。私のコードはすべてレゴコンストラクタ、つまりビデオチュートリアルの教材から組み立てたものです。もちろん、私自身のものが少しあります - それは実際にはエキスパートアドバイザー自体のアルゴリズムであり、全体のコードと関数は私自身の発明ではありませんが、TradeLikeaProからビデオチュートリアルから来て、私は正確に類推によって、私自身のニーズのためにコードを "編集" - 私のアルゴリズムのために。結局、自分の持っているものを手に入れた。

 
geratdc:   私のコードはすべてレゴのコンストラクタです。つまり、TradeLikeaProのビデオチュートリアル教材から組み立てたもので、さらに、私自身のアルゴリズムのために、まさに類推によって、私のニーズに合わせてコードを「編集」したのです。結局、自分が持っているものは自分が持っている。

デポジットのグラフを見て、興味を持ち、最初のバージョンをダウンロードしました。MetaEditにコピーした。2つの警告があります。まず、int timeprev=0;をdatetime timeprev=0;に置き換えることで解消しました。この変数には日付が入っているからです。2つ目は、以下の通りです。

tp=TakeProfit;             // В переменную tp заносится значение переменной TakeProfit
if(tp>TakeProfit)          // А тут они сравниваются. А с чего им быть разными, если только что уравняли?
{
   TakeProfit+=tp;
}

最後の3本の弦を外しました。きれいに翻訳してくれます。さらに進んで...。

//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   if(Digits == 3 || Digits == 5)  // После этой строки нужны фигурные скобки.
      TakeProfit     *= 10;        // иначе эта строка будет выполняться по условию

      // а следующие строки будут выполняться всегда
      Step           *= 10;
      TrailingStep   *= 10;
      TrailingStop   *= 10;
      Slippage       *= 10;

      
   return(INIT_SUCCEEDED);
  }

が変更されたので(説明のためにスクリプトを添付します - 実行してください。

//| Инициализация на пятизнак или иену                               |
//+------------------------------------------------------------------+
void OnInit()
{
   if(Digits == 3 || Digits == 5)
   {
      TakeProfit     *= 10;
      Step           *= 10;
      TrailingStep   *= 10;
      TrailingStop   *= 10;
      Slippage       *= 10;
   }
}
//+-------------------------------------------------------+
//| Демонстрация назначения фигурных скобок      PROBA.mq4|
//+-------------------------------------------------------+
#property strict

void OnStart()
{
  // Без фигурных скобок
  if(2==5)
    Alert("Это сообщение будет пропущено");
    Alert("Без фигурных скобок это сообщается, хотя по логике зря");

  Alert("-------------------------------");
  Alert("А вот со скобками - полный молчок");
  if(2==5)
  {
    Alert("Это сообщение будет пропущено");
    Alert("Со скобками это тоже пропускается");
  }
}
以下はその結果です。


この関数は削除されました - この関数の呼び出しはなく、その本体は空です。

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }

走らせて見た。

でした。

同じツールとSlippageで2つのチャートでEAを実行するときだけ変更しました。なぜこのパラメータを変更したのですか?そこで考えたのが、パラメータを10倍にすることでした。そして、OnInitという関数を 削除しました。結局、5桁のコードしか使っていないんです。なぜかというと、4桁のスプレッドが3ポイントだから、30なんです。そして、5桁のスプレッドはわずか12です。

が明確になった。

extern double  Lots           = 0.01;  // Размер лота
extern int     TakeProfit     = 5 0;    // Ограничение прибыли Take Profit
extern int     Step           = 2 0;    // Шаг - чего, выясним позже

extern int     TrailingStep   = 3 0;    // Шаг трала
extern int     TrailingStop   = 10;    // Ограничение убытка

extern int     MaPeriod       = 200;   // Период МА (надо поменьше?)
extern int     MaShift        = 1;     // Сдвиг МА (взял бы 0)

       int     Magic          = 123;   // Магик - нужен ли он?
       int     Slippage       = 50;    // Проскальзывание

datetime timeprev=0;

double price,op,cn,tp;  // Убрал extern

ヘッダーの上部を切り落としました。それが、私が残したものです。

//+------------------------------------------------------------------+
//|                                                      -Э-1111.mq4 |
//+------------------------------------------------------------------+
#property strict

この行の右側です。

   op=CalculateProfit();
   if (CalculateProfit()>=tp) CloseAll();

は、それをクレームに移した。こんな感じです。

   op=CalculateProfit();
   if (op>=tp)
   {
         CloseAll();    
   }

そして、冒頭のop変数の記述を捨て、次のように置き換えた。

   if (CalculateProfit()>=tp) CloseAll();

OnTick関数の冒頭には、いくつかの行があります。これは、1ティック毎ではなく、1バー毎に1回だけ処理が行われるようにするためです

   if(timeprev == Time[0]) return;   // сравнить  время начала последнего бара с временем обработанного бара. Если равны, то выход
   timeprev = Time[0];               // Запомнить время начала следующего бара      На часовом и далее это будет слабо

そして、MAを算出する。これは詳細に検討する必要があります。そのためにスクリプトを作成し、その結果を表示させました

   double maprice=iMA(Symbol(),0,MaPeriod,MaShift,MODE_SMA,PRICE_CLOSE,1);
//+-------------------------------------------------------+
//| Проверка функции iMA                         PROBA.mq4|
//+-------------------------------------------------------+
#property strict

void OnStart()
{
  int MaPeriod=200;
  int MaShift=1;

  Alert("MaShift = ", MaShift);
  for(int Бар=0; Бар<5; Бар++)
  Alert("Бар = ", Бар, "   Ma = ",
    iMA(Symbol(),0,MaPeriod,MaShift,MODE_SMA,PRICE_CLOSE,Бар));

  Alert("-------------------------");
  MaShift=0;
  Alert("MaShift = ", MaShift);
  for(int Бар=0; Бар<5; Бар++)
  Alert("Бар = ", Бар, "   Ma = ",
    iMA(Symbol(),0,MaPeriod,MaShift,MODE_SMA,PRICE_CLOSE,Бар));
} 

4番目のMaShiftパラメータと最後のパラメータが合計されていること、つまり小節数=それらの合計であることがわかります。2小節目から、最後から3番目にMAを取る。

さらに詳しく見ていきます。興味ありますか?

 
STARIJ:
...

探し続けます。興味ありますか?

その話を持ち出すのか?

もういいよー、興味ある人は話題についていくし、無駄だよー。

答えてほしい人は、スレッドに呼び出す。こんな感じ。STARIJ.でも、前回の投稿を編集してまで話題を提供し続ける必要はないですよ。


 
Victor Nikolaev:

誰かが運が悪いということです。もう一度言います。これはスクリプトであり、Expert Advisorやインジケーターではありません。

どうやら端末のメモリが足りないようで、いくつかのチャートを閉じたらうまくいきました。

ありがとうございます。確かに、計算が行われますね。

また、変数がint型ではなくbool型だった場合はどうすればいいのでしょうか?

 

こんにちは、教えてください。

1 - 登録は自然人としてのみ可能か、それとも法人としても可能か、また制限や条件はあるか。

2 - ソーシャルネットワークと同期して、1つのアカウント(ユーザー名とパスワード)を持つことができますか?

3 - 「自分のページにウィジェットを置いて、シグナルを共有する」という機能も見ましたが、これはサイトの話なのでしょうか、それとも別の話なのでしょうか。


 
こんにちは、私は最近Mql4を学び始めたばかりです。もし、私が間違った場所で質問していたら、正しいテーマに誘導してください。私の質問は以下の通りです:様々なゾーンや長方形などを構築するインジケータをどのように扱うか。私は、ラインのクロスや価格の上下、例えばMAをプログラムすることがあります。)私は、下部にインジケータを添付し、バッファは4であり、ゾーンの8種類があります。だから、実はこのゾーンのブレークやブレークをどうコーディングすればいいのかがわからないんです。
ファイル:
 
STARIJ:

デポジットのグラフを見て、興味を持ち、最初のバージョンをダウンロードしました。MetaEditにコピーした。2つの警告があります。まず、int timeprev=0;をdatetime timeprev=0;に置き換えることで解消しました。この変数には日付が入っているからです。2つ目は、以下を指します。

*

レスポンス

おそらく、ビデオレッスンではTPがint型であったことが関係していると思いますが、doubleに変換したのでint型のtimeprevはそのまま残っています。OK、修正します。 しかし、EAの動作にどのような影響があるのでしょうか?実は、これらのバーと時間は、ビデオチュートリアルのTrailingStop関数に関連していましたが、この関数を私自身の関数に置き換えたので、単にソースコードの遺物として残り、私のトレーリングストップは実際にはバーの時間に基づくものではありません。


最後の3行を削除しました。きれいに翻訳してくれます。さらに進んで...。

私はこれを次のように変更しました(説明のためにスクリプトを添付します。

以下はその結果です。

*回答はこちら

このコードはどこに行ってしまったのでしょうか?

   return(INIT_SUCCEEDED);
  }

こんな感じでいいのでは?


void OnInit()

{

if(Digits == 3 || Digits == 5)

{

ステップ *= 10;

TrailingStep *= 10;

TrailingStop *= 10;

スリッページ *= 10;

}

return(INIT_SUCCEED);

}

しかし、なぜTakeProfitをint型にしたかというと、CalculateProfit()関数がdouble型であるのに対し、ポイント単位で利益を出すということなので、整合性を取るために同じ型にしたのです。


この関数を削除しました - この関数の呼び出しはなく、本体も空です。

*

レスポンス

コードの中に、void CloseAll()関数があります。 この関数と何らかの関係があるのではと思いました。

//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---

  }

*

レスポンス

よし、削除しよう。


実行してみて、見た。

でした。

を変更するために、コメントを追加し、Magicからexternを削除しただけです。

*

レスポンス

そうですね、externは余分かもしれません。

- 同じツールとスリッページで2つのチャートでEAを実行するときだけ変更する - なぜこのパラメータを変更するのですか?そこで考えたのが、パラメータを10倍にすることでした。そして、OnInitという関数を 削除しました。結局、5桁のコードしか使っていないんです。なぜかというと、4桁のスプレッドが3ポイントだから、30なんです。5桁のスプレッドでは、12しかない。

*

その答えは.

これは、EAがすべての通貨で動作するための初期設定です。Oninit()のままにしておきます。

が明確になった。

上部のヘッダーをトリミングしています。以下は、私が残したものです。

*

返信

このヘッダーは、デフォルトのエディターで作成されます。この線が抜けているために、ブローカーや端末で何かが通らない場合を想定して、そのままにしておくのです。

この行を移動しました

がクレームに移った。それは次のようなものでした。

そして、冒頭の変数opの記述を削除し、次のように置き換えた。

*

レスポンス

かなり論理的な話です。



OnTick関数の冒頭には、いくつかの行があります。これは、1ティック毎ではなく、1バー毎に1回だけ処理が行われるようにするためです。

そして、MAを算出する。これは詳細に検討する必要があります。そのためにスクリプトを作り、その結果を出力しています。


4番目のパラメータMaShiftと最後のパラメータが合計されていること、つまり小節数=それらの合計であることがわかります。2小節目からMAを、3小節目は最後から取っています。

*

レスポンス

私は末尾を変更したという事実のために - 日付-時間 移動平均は、私が考えるに関連していない。ソースコードの遺物です、以前は3(スリー)オープンオーダーのラストでトラブってみたりしてました。STepの値だけ相場が間違った方向に行くと、EAは反対注文を出し、さらに相場が反対方向に行き続けると、2番目のポジションのタイプの3番目の注文が追加されるというものです。その逆も然りで、もし価格が方向転換したら、3番目の注文は最初の注文タイプ(買いまたは売り)で開かれます。 そこでは、CalculateProfit()関数を使って3つの注文にトレーリングが行われます。しかし、最初の注文がうまく開き、価格がその通りに動いたら、この状況では、ビデオチュートリアルのようにdatetimeを使ってバーでのトレーリングが行われます - 私は繰り返し、1注文でもCalculateProfit()関数を使ってトレーリングします。

さらに詳しく見ていきます。興味ありますか?

*

レスポンス

ええ、トローリングには問題があります。軌跡を描くようですが、これで何を作ったのか誰にも理解してもらいたくないのです。Trailing()関数は、バーとdatetimeなしで動作します - Trailing()で動作します。

MA周期は200程度ですが、要は調整可能な値ということです。そして、肝心のパラメータValueが抜けているようです。その意味は、READMEファイルの説明で説明しています。



わざわざありがとうございました。実 際、Expert Advisorは、機械的に言うと、それほど良いものではありません。でも、基本的にはセットアップして、ときどきその働きを監視すれば、結構いいかもしれません。時間が解決してくれるでしょう。おそらく、彼らは何かを稼ぐことができますが、彼らは瞬きもせずに倒産し、テキストメッセージを送信しません。 私のアイデアは、ドローダウンが預金の30%以上が発生した場合にSMSを送信することでしたが、私もそれを気にしていない - これは3注文がすでに開かれ、市場が反対運動を開始したことを意味し、この状況では、それはパラフィンのにおいがする。それ以外のケースは、取引ツールチャートの行動履歴を調整すれば、Expert Advisorで解決します。


とりあえずメモ帳でコードの推奨(全てではありませんが)変更を行いました。コードを修正したかどうか確認してください。

私は最適化のために、唯一の私はあなたがoninitを削除した瞬間を考慮していない - 私はそれがすべての通貨でテストして動作できるようにする必要があります)))。

ファイル:
 
Aleksandr Verkhozin:
こんにちは、私は最近Mql4を学び始めたばかりです。もし、私が間違った場所で質問していたら、正しいテーマに誘導してください。私の質問は以下の通りです:様々なゾーンや長方形などを構築するインジケータをどのように扱うか。私は、ラインのクロスや価格の上下、例えばMAをプログラムすることがあります。)私は、下部にインジケータを添付し、バッファは4であり、ゾーンの8種類があります。だから、これらのゾーンのブレイクやブレイクアウトをどのようにコード化すればいいのかがわからない。

プログラマーについてもっと知りたい人は、サンプルに目を通したり、サイト内のリンクを利用するとよいでしょう。と聞かれるかもしれませんが、mql4プログラマーはどうやって多くの時間を費やしているのでしょうか(笑)。もしかしたら、進歩するかもしれません。
 

geratdc:

...
そうだ、トロールのことで聞きたいことがあるんだ。トラブっているようだが、誰も私が何をしたのか知りたがらない。

...

ご存知でしたら、このスレッドでちょうど、送られてきた指標値を計算に使うトロールのテンプレートを投稿しました。調べろ、怠けるな。
 
geratdc:

RuTrackerのTradeLikeAproからmql4プログラミングビデオチュートリアルをダウンロードする必要がある場合があります。mql4のインジケータはすぐに取得できるそうですが、やり方がわからないとエラーメッセージが出ることがあるそうです)。もしかしたら、進歩するかもしれません。


外部インジケーターの操作に関するビデオを見て、テスターのバッファの値を見るためのコードを少し書きました。

void OnTick()

{

double Buf1=iCustom(NULL,0, "Shved-Supply-and-Demand-e600",0,1);

double Buf2=iCustom(NULL,0, "Shved-Supply-and-Demand-e600",1,1);

double Buf3=iCustom(NULL,0, "Shved-Supply-and-Demand-e600",2,1);

double Buf4=iCustom(NULL,0, "Shved-Supply-and-Demand-e600",3,1);

Comment("Buf1=",Buf1,"\n", "Buf2=",Buf2,"\n","Buf3=",Buf3,"\n","Buf4=",Buf4);

}

可視化モードでは、ゾーンが現れたり消えたりします。しかし、バッファの値はいずれにせよ常にゼロです。これらのゾーンをコードで正式に表現する方法はないのでしょうか?

もしかしたら、iCustom以外に、このような指標に適した関数があるかもしれませんね。もしかしたら、そのような指標でフクロウを書いた人がいるかもしれませんね。