初学者的问题 MQL5 MT5 MetaTrader 5 - 页 1432

 

大家好、

我是新来的,希望我写对了地方:我正在尝试编写一个 EA,它可以帮助我进行资金管理,比如..............:

"当过去的损失+当前的缩水低于 x% 时,关闭所有交易 "+"立即关闭所有交易,直到交易时段/交易日结束"。

如果有人知道如何做到这一点,或者可以帮助我,请与我联系。

谢谢,祝您交易顺利)

 
jeremy10p100 # :

大家好

我是新来的,希望我写对了地方:我想编写一个 EA,帮助我进行资金管理,比如.NET、.NET、.NET、.NET 和.NET:

"当过去的损失+当前的缩水低于 x% 时,关闭所有交易 "+"立即关闭所有交易,直到交易时段/交易日结束"。

如果有人知道如何做到这一点或可以帮助我,请与我们联系。

谢谢,祝您交易顺利)

您好、

请尝试在市场上搜索现成的解决方案 -https://www.mql5.com/fr/search#!keyword=money%20management&module=mql5_module_market

您也可以向自由职业者订购定制解决方案 -https://www.mql5.com/fr/job

 
大家好!请告诉我如何将数组中的值复制到数据库中? 下面是使用数据库的示例代码,当我尝试将数组中的数据插入数据库中的 SALARY 字段时,在运行脚本时出现错误。 还有一个问题,例如,如果我有一个包含订单数据的数组,而且有很多订单,我如何将所有这些数组移动到数据库中的一个表中?
 VALUES (1,'Paul',a,'California',29000.00)  -->  VALUES (1,'Paul',a,'California',Mass[0])

void OnStart()
  {
  double Mass[4]={1,2,5,6};
  int a =222;
  Alert(Mass[3]);
   string filename="company.sqlite";
//--- создадим или откроем базу данных в общей папке терминалов
   int db=DatabaseOpen(filename, DATABASE_OPEN_READWRITE | DATABASE_OPEN_CREATE |DATABASE_OPEN_COMMON);
   if(db==INVALID_HANDLE)
     {
      Print("DB: ", filename, " open failed with code ", GetLastError());
      return;
     }
//--- если таблица COMPANY существует, то удалим её
   if(DatabaseTableExists(db, "COMPANY_2"))
     {
      //--- удаляем таблицу
      if(!DatabaseExecute(db, "DROP TABLE COMPANY_2"))
        {
         Print("Failed to drop table COMPANY with code ", GetLastError());
         DatabaseClose(db);
         return;
        }
     }
//--- создаем таблицу COMPANY
   if(!DatabaseExecute(db, "CREATE TABLE COMPANY_2("
                       "ID INT PRIMARY KEY     NOT NULL,"
                       "NAME           TEXT    NOT NULL,"
                       "AGE            INT     NOT NULL,"
                       "ADDRESS        CHAR(50),"
                       "SALARY         REAL );"))
     {
      Print("DB: ", filename, " create table failed with code ", GetLastError());
      DatabaseClose(db);
      return;
     }

//--- вставляем данные в таблицу
   if(!DatabaseExecute(db, "INSERT INTO COMPANY_2 (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1,'Paul',a,'California',Mass[0]); "
                       "INSERT INTO COMPANY_2 (ID,NAME,AGE,ADDRESS,SALARY) VALUES (2,'Allen',25,'Texas',Mass[1]); "
                       "INSERT INTO COMPANY_2 (ID,NAME,AGE,ADDRESS,SALARY) VALUES (3,'Teddy',a,'Norway',Mass[2]);"
                       "INSERT INTO COMPANY_2 (ID,NAME,AGE,ADDRESS,SALARY) VALUES (4,'Mark',25,'Rich-Mond',65000.00);"))
     {
      Print("DB: ", filename, " insert failed with code ", GetLastError());
      DatabaseClose(db);
      return;
     }

//--- создадим запрос и получим хендл на него
   int request=DatabasePrepare(db, "SELECT * FROM COMPANY_2");
   if(request==INVALID_HANDLE)
     {
      Print("DB: ", filename, " request failed with code ", GetLastError());
      DatabaseClose(db);
      return;
     }

   DatabasePrint(
      db,          // хендл базы данных, полученный в DatabaseOpen
      "COMPANY_2",      // таблица или SQL-запрос
      0              // комбинация флагов
   );
  }
//+------------------------------------------------------------------+


 

比如,试试这样做。

而不是

if(!DatabaseExecute(db, "INSERT INTO COMPANY_2 (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1,'Paul',a,'California',Mass[0]); "
                       "INSERT INTO COMPANY_2 (ID,NAME,AGE,ADDRESS,SALARY) VALUES (2,'Allen',25,'Texas',Mass[1]); "
                       "INSERT INTO COMPANY_2 (ID,NAME,AGE,ADDRESS,SALARY) VALUES (3,'Teddy',a,'Norway',Mass[2]);"
                       "INSERT INTO COMPANY_2 (ID,NAME,AGE,ADDRESS,SALARY) VALUES (4,'Mark',25,'Rich-Mond',65000.00);"))

if(!DatabaseExecute(db, "INSERT INTO COMPANY_2 (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1,'Paul',a,'California'," + DoubleToString(Mass[0]) + "); "
                       "INSERT INTO COMPANY_2 (ID,NAME,AGE,ADDRESS,SALARY) VALUES (2,'Allen',25,'Texas'," + DoubleToString(Mass[1]) + "); "
                       "INSERT INTO COMPANY_2 (ID,NAME,AGE,ADDRESS,SALARY) VALUES (3,'Teddy',a,'Norway'," + DoubleToString(Mass[2]) + ");"
                       "INSERT INTO COMPANY_2 (ID,NAME,AGE,ADDRESS,SALARY) VALUES (4,'Mark',25,'Rich-Mond',65000.00);"))

这不是唯一的方法。

 
Yuriy Bykov #:

例如,试着这样做。

而不是

这不是唯一的方法。

谢谢!这很有效,我在哪里可以读到?还有其他方法吗?

 
lego9955 创建一个自定义角色。

我需要对它进行修改,使它不仅能创建一个字符,还能创建脚本中写入的多个字符。

例如,AB AC AD 三个,以后可以按照这个原则任意添加。

每次都从列表中替换下一个符号名称,如此循环。

比如

string sNames = "AB,AC,AD";
string aNames[];

void OnStart()

  {
   int i;
   bool ch=true;

   if(StringSplit(sNames,StringGetCharacter(",",0),aNames) <= 0)return;

   ResetLastError();
   for(i=0; i<ArraySize(aNames); i++)
      {
       ch=ch && CustomSymbolCreate(aNames[i]);
       if(!ch)
         {
          PrintFormat("Symbol '%s' : error %d",aNames[i],GetLastError());
          break; // При первой ошибке выходим
         }
      }
   if(!ch)return;
   ...
  } 
 

我以前也这么做过,但我以为我已经做完了,所以删除了我的帖子。

void OnStart()
{
string arr[]= { "AB", "AC", "AD" };

  for(int i=0; i<ArraySize(arr); i++)

  {
   bool ch =CustomSymbolCreate(arr[i]);
   SymbolSelect(arr[i],true); 
  }  
}

当我刷新页面时,我看到你已经回复了。是的,错误处理 更正确了。谢谢!

 
lego9955 错误处理 更正确了。谢谢!
ArraySize(arr)

在循环外用 ushort 定义更正确

 
lynxntech #:

更正确的做法是在循环外用 uint 定义

我经常这样做,但我还是希望相信编译器能优化这种标准的东西。

 

机器人有两个过滤器:随机 过滤器和RSI 过滤器,每个过滤器都有一组参数。只能使用一个过滤器。也就是说,如果随机 指数打开,RSI 就应该关闭,反之亦然。

现在我做到了:

  • 我为StochasticRSI 设置了输入 变量,启用或禁用它们的工作。
  • OnInit 程序块 中,如果StochasticRSI 同时打开,我将检查INIT_PARAMETERS_INCORRECT 错误。
  • OnInit 程序块中,如果随机 关闭,则其所有参数必须为零,否则将出现 INIT_PARAMETERS_INCORRECT/ 错误,RSI 也是如此。

目的:

  • 在优化不兼容的选择时不浪费时间。例如,如果选择RSI,则不会搜索随机 参数(超买/超卖区域大小、KD 周期、减速、平滑方法、价格)。
  • 事实证明,我的选择不起作用。在优化过程中,这些变量似乎被过度优化了,这影响了优化的最终结果

请教如何使优化器在启用RSI 时不搜索随机 参数,反之亦然。