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

 
Artyom Trishkin #:

あなたは私の質問のポイントを外している。サーバーがメモリを使い果たしてバーストするのを待つ必要はない。

コードにオブジェクト・リークがある場合は、Expert Advisorを実行したまま、自宅のローカル・コンピュータで再コンパイルしてください。リークしたオブジェクトの数と種類に関するメッセージがログに表示されるはずです。もちろん、リークがある場合は、リークに関するメッセージも表示されるはずです。

コンパイル時には何も書きません。削除して新しいものをインストールする。これで終わり。

NM      0       00:18:47.545    Experts expert Comm (SBRF-12.23,M1) removed
JI      0       00:18:47.547    Experts expert Comm (SBRF-12.23,M1) loaded successfully
KQ      0       00:18:47.560    Experts expert Comm (RTS-12.23,M1) removed
EE      0       00:18:47.562    Experts expert Comm (RTS-12.23,M1) loaded successfully

サーバーではまだ動いている。もしかしたらログに何か書いてくれるかもしれない。

 
Aleksandr Slavskii #:

コメントのアナログを作ろうとしたが、文字が大きくなってしまった。

いくつかのチャートにコメントを入れてExpert Advisorを実行してからしばらくすると、画面が消えたり、サーバーが再起動したりと悪いことが起こります))))

CCanvasクラスで何か間違ったことをしているのは明らかなのですが、具体的に何が間違っているのかがわかりません。

わかったような気がする。もし間違って理解していたら訂正してください。

私のコードでは、ティックごとに異なる名前でリソースを作成している。

キャンバスからのコード

      //--- generate resource name
      m_rcname="::"+name+(string)ChartID()+(string)(GetTickCount()+MathRand());
      //--- initialize data with zeros
      ArrayInitialize(m_pixels,0);
      //--- create dynamic resource
      if(ResourceCreate(m_rcname,m_pixels,width,height,0,0,0,clrfmt))

そして、次の画像の更新時に、このリソースは削除されないようです。

オブジェクトは同じですが、リソースは異なる名前でアタッチされています。

そこで、コードを書き直した。

正しいはずだ。

#include <Canvas\Canvas.mqh>
//+------------------------------------------------------------------+
void Comm(string txt, color clr = clrYellow, int FontSize = 20, string Font = "Consolas", int flag = FW_BOLD)
  {
   int shift = 0;
   if(ChartGetInteger(0, CHART_SHOW_ONE_CLICK))
      shift = 60;

   CCanvas canvas;
   canvas.FontNameSet(Font);
   canvas.FontFlagsSet(flag);
   canvas.FontSizeSet(FontSize);

   int width = 0, height = 0;
   string result[];
   int size = StringSplit(txt, StringGetCharacter("\n", 0), result);
   height = (int)(FontSize * 1.8 * size);

   for(int i = 0; i < size; i++)
     {
      int w = canvas.TextWidth(result[i]);
      if(width < w)
         width = w;
     }

   if(ObjectFind(0, "Comment") < 0)
      canvas.CreateBitmapLabel(0, 0, "Comment", 5, 20 + shift, width, height, COLOR_FORMAT_ARGB_NORMALIZE);
   else
      canvas.Attach(0, "Comment", width, height, COLOR_FORMAT_ARGB_NORMALIZE);
   canvas.Erase(0x00FFFFFF);

   for(int i = 0; i < size; i++)
      canvas.TextOut(0, (int)(FontSize * 0.8 * i), result[i], ColorToARGB(clr, 255));

   canvas.Update(true);
  }
//+------------------------------------------------------------------+
 
Aleksandr Slavskii #:

コンパイル時には何も書き込まない。アンインストールして再構築する。それだけだ。

サーバー上ではまだ動いている。もしかしたらログに何か書いてくれるかもしれない。

「専門誌

 
Artyom Trishkin #:

専門誌

エキスパート・マガジンでは、無菌の清潔さを。

//---

問題の原因は概ね解決した。

問題は、プログラムを終了 するときに、kanvas が作成したリソースをメモリから削除する方法です。

オブジェクトを削除すると、名前はあるのですが、リソースの名前が「保護」されていて、どうやっても認識できません。

そう、OOPとはおかしなものなのだ。

結局、関数本体ではなくグローバルでcanvasを宣言し、deinitにcanvas.Destroy()を追加することになった;

フライトは問題ない)

 

こんにちは!

長い間、私はリスクに応じてロットを計算するための既製の関数を使ってきましたが、それはストップ・ロス・サイズとの結合を持っていませんでした。今日、スクリプトの形で(チェックしやすいように)ゼロから独自の関数を書くことにしました。ー ロット・サイズ計算式(ー 黄色でー)もしかしたら何か見落としていたかもしれません。

最小ロット、最大ロット、ステップなど あらゆる種類のチェックは、後で私が行うので、含まれていません!

ー ウラジミール

//+------------------------------------------------------------------+
//|                                   Lot_Size_Depending_On_Risk.mq5 |
//|                                  Copyright 2023, MetaQuotes Ltd. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2023, MetaQuotes Ltd."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property script_show_inputs
input double Risk=5;      // Размер риска
input uint Stop_Loss=500; // Размер стоп-лосса
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
double Lot_Size_Depending_On_Risk()
  {
   //--- определим валюту депозита
   string symbol="";
   string account_currency="";
   symbol=account_currency==AccountInfoString(ACCOUNT_CURRENCY) ? "EURUSDrfd" : "USDRUBrfd";
   double trading_account_currency=NormalizeDouble(SymbolInfoDouble(symbol,SYMBOL_BID),2);
   double lot=(AccountInfoDouble(ACCOUNT_MARGIN_FREE)*Risk*0.01)/(Stop_Loss*trading_account_currency);
   return(lot);
  }
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   Print(DoubleToString(Lot_Size_Depending_On_Risk(),2));
  }
//+------------------------------------------------------------------+
 
MrBrooklin #:

皆さん、ごきげんよう!

私は長い間、リスクに応じてロットを計算するための既製の関数を使ってきましたが、それはストップロス・サイズとの結合を持っていませんでした。今日、スクリプトの形で(チェックしやすいように)ゼロから独自の関数を書くことにしました。ロットサイズの計算式をご覧ください(黄色でハイライト)。もしかしたら何か見落としているかもしれません。

最小ロット、最大ロット、ステップなどなど、あらゆる種類のチェックは、後でやるので入れていません!

よろしく、ウラジミール。

1ティックのコストを考慮する必要があります。

 
Alexey Viktorov #:

ダニ1匹あたりのコストを必ず考慮すること。

こんにちは、アレクセイ。自己啓発のために、1ティックのコストを考慮する目的を理解したいのですが、差し支えなければ、計算式のどの部分に適用すべきかについても簡単に説明してください。おそらく、私はあなたがおっしゃっていることをよく理解していないのでしょう。

よろしくお願いします。

 
MrBrooklin #:

こんにちは、アレクセイ。自己啓発のために、1ティックあたりのコストを考慮する目的を理解したいのですが、もし差し支えなければ、計算式のどの部分にそれを適用するかについても簡単に説明してください。私はあなたがおっしゃっていることを誤解しているかもしれません。

よろしくお願いします。

トレーダーが失敗した場合の損失額を決定する。損失=損失*ピップ値*ロット。したがって、-ロット=許容損失額/(損失額*ピップ 値)計算式は概算 です。

 
Alexey Viktorov #:

トレーダーが失敗した場合の損失額を決定する。損失=損失*ピップ値*ロット。ー ロット = 許容損失額/ー(損失額*ピップ 値)計算式はー ロット = 許容損失額*ピップ値

なるほど。どのように実行するか、ゆっくり考えてみます。アドバイスありがとうございました!

ウラジミール

 

テスターでポジションをクローズする時間を知るにはどうすればよいですか?

ポジション1、2、3をオープンします。

ポジション3、2、1をクローズします。

テスターのレポートでもテスター自体でも、特定のポジションのクローズ時間を調べる方法がわかりません。

テスターが記録するレポートにも、ポジションのクローズ時間を調べる方法はありません。


ポジションのオープンとクローズの時間を知りたいのですが。どうやって?

fxsaberの ライブラリの 一つに、「テスターのキャッシュを作成し、そのフォーマットを開く手助けをしてくれた開発者に感謝します。

私はそのライブラリ自体を理解することができません。

opt ファイルのフォーマットしか見つけられませんでした。

フォーラムでtst-files - single pass formatを 開示している場所を知っている人がいたら リンクを教えてください。

fxsaber さん、もし読んだら返事ください。

理由: