初学者的问题 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 #:

我试着做了一个类似的评论,但字母更大。

在几个图表上运行带有注释的智能交易系统一段时间后,发生了一些糟糕的事情,屏幕熄灭,服务器重启)))))。

很明显,我在使用 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 创建的资源。

我删除了对象,它有一个名称,但资源的名称是 "protected"(受保护的),你根本无法识别它。

是的,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 #:

祝大家今天愉快

长期以来,我一直在使用一个现成的函数,根据风险计算手数,但它并不与止损大小绑定。今天,我决定以脚本的形式从头开始编写自己的函数(便于检查),但要将止损考虑在内。请参阅手数计算公式(用黄色标出)。也许我漏掉了什么。

没有包括对最小、最大手数、步长等 各种检查,因为我稍后会做!

弗拉基米尔

有必要考虑一个刻度线的成本。

 
Alexey Viktorov #:

请务必考虑每次勾选的成本。

你好,阿列克谢,谢谢你的回复。出于自学的目的,如果您不介意的话,我想了解一下考虑一个刻度线的成本的目的,并简要解释一下它应该应用在公式的哪个部分。也许我不太明白您在说什么。

再见,弗拉基米尔。

 
MrBrooklin #:

你好,阿列克谢,感谢您的回复。出于自学的目的,我想了解一下考虑每次勾选成本的目的,如果您不介意的话,还请简要解释一下在公式的哪个部分应用它。我可能误解了您的意思。

再见,弗拉基米尔。

确定交易者在失败时愿意损失的金额。损失 = 损失*点值*手数。因此 - 手数 = 可接受的损失/(损失*点 值) 该公式为近似值

 
Alexey Viktorov #:

确定交易者在失败时愿意损失的金额。损失 = 损失*点值*手数。因此 - 手数 = 可接受的损失/(损失*点 值) 该公式为近似值。

我明白了。我会在闲暇时考虑如何实现它。谢谢您的建议!

弗拉基米尔

 

如何在测试仪中找出平仓时间?

我打开仓位 1、2、3

我平仓 3、2、1

无论是在测试仪报告中还是在测试仪本身,我都不知道如何找出某个仓位的平仓时间。

同样,在测试仪记录的报告中,也无法找到平仓时间。


我需要找出开仓和平仓的时间。如何实现?

fxsaber 在其一个库中 写道:"感谢开发人员创建测试器缓存并帮助我打开其格式。

我无法理解库本身。

我只能找到opt 文件的格式。

如果有人知道论坛上哪里公开了tst 文件 - 单程格式 ,请给我一个链接,也许我能在其中找到 position_ID。

fxsaber 如果您读到,请回复。