初学者的问题 MQL4 MT4 MetaTrader 4 - 页 70

 
你好,请你帮助我在MT4中编写一个函数。我知道我的账户余额,我知道将有多少笔交易(如9笔),我知道风险(如账户余额的3%),我需要计算第一笔交易的手数,如果接下来的每笔交易都将翻倍,并且所有交易都将相互重叠。
//Функция расчета торгового лота
double GetLots()
{
 double clots = 0.0;
 double cl = NormalizeDouble(MarketInfo(Symbol(),MODE_MAXLOT),2); 
 double L2 = NormalizeDouble(cl * Multipler,2);
 double L3 = NormalizeDouble(L2 * Multipler,2);
 double L4 = NormalizeDouble(L3 * Multipler,2);
 double L5 = NormalizeDouble(L4 * Multipler,2);
 double L6 = NormalizeDouble(L5 * Multipler,2);
 double L7 = NormalizeDouble(L6 * Multipler,2);
 double L8 = NormalizeDouble(L7 * Multipler,2);
 double L9 = NormalizeDouble(L8 * Multipler,2);
 
 for(cl = NormalizeDouble(MarketInfo(Symbol(),MODE_MAXLOT),2);AccountFreeMarginCheck(Symbol(),OP_BUY,L9) <= (AccountBalance()/100)*Risk;cl--)
 {
  if(!IsStopped()) 
  {
   clots = NormalizeDouble(cl,2);
  }
 } 
 return(clots);
}

这就是我得到的东西。请告诉我什么是错的。提前感谢您!

 

你好!

我在这里写,因为mq4上似乎没有人。

你能告诉我我做错了什么吗?选项2不起作用。

double A[][10];
int renge_A_one=0;                                                    // =ArrayRange(A, 0); // Размер первого измерения (число строк)
int renge_A_two=0;                                                    // =ArrayRange(A, 1); // Размер второго измерения (число столбцов)

double B[][10];
int renge_B_one=0;                                                    // =ArrayRange(A, 0); // Размер первого измерения (число строк)
int renge_B_two=0;                                                    // =ArrayRange(A, 1); // Размер второго измерения (число столбцов)
int count_B=0;

//+------------------------------------------------------------------+
//| Вариант 1. Копируем строки "А" в "В" без изменений               |
//+------------------------------------------------------------------+
void Fun_1()
   {
    renge_A_one==ArrayRange(A, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_A_two==ArrayRange(A, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
    for(int i=0; i<range_A_one; i++)                                  // Перебираем массив A[][10] по ПЕРВОМУ измерению.
        {
         count_B++;
         ArrayResize(B, count_B);
         for(int j=0; j<renge_A_two; j++)                             // Перебираем массив A[][10] по ВТОРОМУ измерению.
              B[i][j]=A[i][j];
        }
    renge_B_one==ArrayRange(B, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_B_two==ArrayRange(B, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
   }
// Результат: "А" скопирован в "В" без изменений 
//            renge_A_one = renge_В_one
//            renge_A_two = renge_В_two

//+------------------------------------------------------------------+
//| Вариант 2. Копируем строки "А" в "В" при условии                 |
//+------------------------------------------------------------------+
void Fun_2()
   {
    renge_A_one==ArrayRange(A, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_A_two==ArrayRange(A, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
    for(int i=0; i<range_A_one; i++)                                  // Перебираем массив A[][10] по ПЕРВОМУ измерению.
        {
         if(A[i][3]>0)
             {
              count_B++;
              ArrayResize(B, count_B);
              for(int j=0; j<renge_A_two; j++)                        // Перебираем массив A[][10] по ВТОРОМУ измерению.
                   B[i][j]=A[i][j];
             }
        }
    renge_B_one==ArrayRange(B, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_B_two==ArrayRange(B, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
   }
// Результат: часть строк "В" с соответствующими значениями
//            часть строк "В" заполнена "0" полностью, при том, что в "А" заполнены ЗНАЧЕНИЯМИ
//            renge_A_one > renge_В_one
//            renge_A_two = renge_В_two
 
Arseniy Barudkin:
你好,请你帮助我在MT4中编写一个函数。我知道我的账户余额,我知道将有多少笔交易(如9笔),我知道风险(如账户余额的3%),我需要计算第一笔交易的手数,如果接下来的每笔交易都将翻倍,并且所有交易都将相互重叠。

这就是我得到的东西。请告诉我什么是错的。提前感谢您!

小学。错误在于GetLots() 函数。整个功能。
 
Leo59:

你好!

我在这里写,因为mq4上似乎没有人。

你能告诉我我做错了什么吗?选项2不起作用。

double A[][10];
int renge_A_one=0;                                                    // =ArrayRange(A, 0); // Размер первого измерения (число строк)
int renge_A_two=0;                                                    // =ArrayRange(A, 1); // Размер второго измерения (число столбцов)

double B[][10];
int renge_B_one=0;                                                    // =ArrayRange(A, 0); // Размер первого измерения (число строк)
int renge_B_two=0;                                                    // =ArrayRange(A, 1); // Размер второго измерения (число столбцов)
int count_B=0;

//+------------------------------------------------------------------+
//| Вариант 1. Копируем строки "А" в "В" без изменений               |
//+------------------------------------------------------------------+
void Fun_1()
   {
    renge_A_one==ArrayRange(A, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_A_two==ArrayRange(A, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
    for(int i=0; i<range_A_one; i++)                                  // Перебираем массив A[][10] по ПЕРВОМУ измерению.
        {
         count_B++;
         ArrayResize(B, count_B);
         for(int j=0; j<renge_A_two; j++)                             // Перебираем массив A[][10] по ВТОРОМУ измерению.
              B[i][j]=A[i][j];
        }
    renge_B_one==ArrayRange(B, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_B_two==ArrayRange(B, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
   }
// Результат: "А" скопирован в "В" без изменений 
//            renge_A_one = renge_В_one
//            renge_A_two = renge_В_two

//+------------------------------------------------------------------+
//| Вариант 2. Копируем строки "А" в "В" при условии                 |
//+------------------------------------------------------------------+
void Fun_2()
   {
    renge_A_one==ArrayRange(A, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_A_two==ArrayRange(A, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
    for(int i=0; i<range_A_one; i++)                                  // Перебираем массив A[][10] по ПЕРВОМУ измерению.
        {
         if(A[i][3]>0)
             {
              count_B++;
              ArrayResize(B, count_B);
              for(int j=0; j<renge_A_two; j++)                        // Перебираем массив A[][10] по ВТОРОМУ измерению.
                   B[i][j]=A[i][j];
             }
        }
    renge_B_one==ArrayRange(B, 0);                                    // Выясняем Размер первого измерения (число строк)
    renge_B_two==ArrayRange(B, 1);                                    // Выясняем Размер второго измерения (число столбцов). "На всякий случай"
   }
// Результат: часть строк "В" с соответствующими значениями
//            часть строк "В" заполнена "0" полностью, при том, что в "А" заполнены ЗНАЧЕНИЯМИ
//            renge_A_one > renge_В_one
//            renge_A_two = renge_В_two

突出显示:应该有一个赋值--"=",你有一个比较--"=="。

 

大家好!
我正在学习在MT4中编写机器人,我决定从二元期权开始。我写了一个最简单的EA,编译器产生了一堆我无法理解的警告(
帮助:"哦,MQL4大师" =))))))
提前感谢!)

以下是该EA的代码。

//+------------------------------------------------------------------+
//|Bolinger_Bands_traider。ǞǞǞ
//|Copyright 2017, Penrov Nikolay | 版权所有
//|vk.com/buzamonolit |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Petrov Nikolay"
#财产链接 "vk.com/buzamonolit"
#财产版本 "1.00"
#属性严格
//+------------------------------------------------------------------+
//|专家初始化功能|
//+------------------------------------------------------------------+
外部int Bolinger_Bands = 20; //布林带 周期。
外部双倍Delta = 0.0003; // 在什么距离开单?

string Symb; // 金融工具的名称。
int Total; // 订单的数量

//+------------------------------------------------------------------+
//|专家初始化功能|
//+------------------------------------------------------------------+
int init()
{
//----
Initialize_Objects(0)。
//----
return(0);
}
//+------------------------------------------------------------------+
//|专家去初始化功能|
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//|专家启动功能|
//+------------------------------------------------------------------+
int start()
{
//----
double price = Bid;
double CurrBol_High = iBands(Symb,0, Bolinger_Bands, 0,0, PRICE_CLOSE, MODE_UPPER, 0);
double CurrBol_Low = iBands(Symb,0, Bolinger_Bands, 0,0, PRICE_CLOSE, MODE_LOWER, 0)。
double PriceBol_High = price - CurrBol_High;
double PriceBol_Low = price - CurrBol_Low;
datetime NextClose = Time[0] + Period()*60*2;
int MinutesToNextClose = (NextClose - TimeCurrent())/60 + 1;
int err;

// 顺序计数
Symb=Symbol()。// 翅片的名称。symbol(); // symbol(); // symbol(); // order icon(); // symbol()。
总计=0。// 订单数量
for(int i=1; i<=OrdersTotal(); i++) // 订单循环
{
如果(OrderSelect(i-1,SELECT_BY_POS)==true) //如果有一个下一个
{// 订单分析。
如果(OrderSymbol()!=Symb)继续; // 不是我们的金融工具
如果(OrderType()>1)// 我们有一个未决订单
{
Alert("检测到挂单,专家顾问不工作;)
return(0);//退出()
}
总计++。// 柜台市场。秩序
如果(总数>1)// 不超过一个订单
{
Alert("几个市场订单,专家顾问不工作。")。
return(0);//退出()
}
}
}

ObjectSetText("Obj_Label", "TF" + Period() + ", " + DoubleToStr(price, 5) + ", tick " + TimeToStr(TimeCurrent() , TIME_SECONDS) + ", O@"+ TimeToStr(Time[0], TIME_MINUTES) + ", NC@"+ TimeToStr(NextClose, TIME_MINUTES) + " (" + MinutesToNextClose + " min)", 10, "Arial", DarkGreen ) 。
ObjectSetText("Obj_Label2", "Orders:" + Total + ", delta " + DoubleToStr(Delta,5) + ", distance to MA:" + DoubleToStr(PriceBol_High, 5), 10, "Arial", DarkGreen ) 。
ObjectSetText("Obj_Label3", "Orders: " + Total + ", Delta " + DoubleToStr(Delta,5) + ", distance to MA:" + DoubleToStr(PriceBol_Low, 5), 10, "Arial", DarkGreen ) 。


//价格分析和开单

如果((MathAbs(PriceBol_Low)<Delta)&&(价格>CurrBol_Low)&&(Open[0]>CurrBol_Low+Delta) &&(Total<1))
{
如果(OrderSend(Symbol(), OP_BUY, 1.00,Bid , 3, 0, 0, "BO exp:900", 0,DoubleToStr(MinutesToNextClose,0), Green) >0) Print ("Opened OK")。
否则
{
err=GetLastError()。
Print("error(",err,"))。
return(0);

}
Print ("CALL @ " + price + " + TimeToStr(TimeCurrent(), TIME_SECONDS) + " exp in " + MinutesToNextClose);

}

如果((MathAbs(PriceBol_High) < Delta) && (price < CurrBol_High) && (Open[0] < CurrBol_High-Delta) && (Total<1)
{
如果(OrderSend(Symbol(), OP_SELL, 1.00,Bid , 3, 0, 0, "BO exp:900", 0,DoubleToStr(MinutesToNextClose,0), Red) > 0) 打印("Opened OK")。
否则
{
err=GetLastError()。
Print("error(",err,"))。
return(0);

}
Print ("PUT @ " + price + " + TimeToStr(TimeCurrent(), TIME_SECONDS) + " exp in " + MinutesToNextClose);

}

//----
return(0);
}
//+------------------------------------------------------------------+

int Initialize_Objects(int Win) // User fie
{// .对象创建
ObjectCreate("Obj_Label",OBJ_LABEL, Win, 0,0); //对象创建
ObjectSet("Obj_Label", OBJPROP_CORNER, 0); // 绑定到一个角上
ObjectSet("Obj_Label", OBJPROP_XDISTANCE, 13); // X坐标
如果(Win==0)
ObjectSet("Obj_Label",OBJPROP_YDISTANCE, 15);//Y坐标
否则
ObjectSet("Obj_Label",OBJPROP_YDISTANCE,15);//Y坐标

ObjectCreate("Obj_Label2",OBJ_LABEL,Win, 0,0); // 对象创建
ObjectSet("Obj_Label2",OBJPROP_CORNER, 0); // 绑定到一个角落。
ObjectSet("Obj_Label2", OBJPROP_XDISTANCE, 13); // X坐标
如果(Win==0)
ObjectSet("Obj_Label2",OBJPROP_YDISTANCE, 35);//Y坐标
否则
ObjectSet("Obj_Label2",OBJPROP_YDISTANCE, 35);//Y 坐标。

ObjectCreate("Obj_Label3",OBJ_LABEL, Win, 0,0); // 创建对象
ObjectSet("Obj_Label3",OBJPROP_CORNER, 0); // 绑定到一个角落。
ObjectSet("Obj_Label3", OBJPROP_XDISTANCE, 13); // X坐标
如果(Win==0)
ObjectSet("Obj_Label3",OBJPROP_YDISTANCE, 55);//Y坐标
否则
ObjectSet("Obj_Label3",OBJPROP_YDISTANCE, 55);//Y 坐标。

return(0);//从用户处退出。功能
}

 

以下是警告。我搞不清楚他不喜欢什么(


由于类型转换可能导致数据丢失 Bolinger_Bands_traider.mq4 51 24
从 "数字 "到 "字符串 "的隐式转换 Bolinger_Bands_traider.mq4 76 35
从 "数字 "到 "字符串 "的隐式转换 Bolinger_Bands_traider.mq4 76 227
从 "数字 "到 "字符串 "的隐式转换 Bolinger_Bands_traider.mq4 77 43
从 "数字 "到 "字符串 "的隐式转换 Bolinger_Bands_traider.mq4 78 43
从 "字符串 "到 "数字 "的隐式转换 Bolinger_Bands_traider.mq4 85 71
从 "数字 "到 "字符串 "的隐式转换 Bolinger_Bands_traider.mq4 93 23
从 "数字 "到 "字符串 "的隐式转换 Bolinger_Bands_traider.mq4 93 91
从 "字符串 "到 "数字 "的隐式转换 Bolinger_Bands_traider.mq4 99 72
从 "数字 "到 "字符串 "的隐式转换 Bolinger_Bands_traider.mq4 107 23
从 "数字 "到 "字符串 "的隐式转换 Bolinger_Bands_traider.mq4 107 91
0个错误(s), 11个警告(s), 编译时间: 204 msec 1 12

 
Vitalie Postolache:
小学。错误在于GetLots() 函数。整个功能。

也许你能告诉我怎么写才正确。我想用循环的方式计算,从最大的手数开始强行计算。
 
Arseniy Barudkin:

也许你能告诉我怎么写才正确。我想用一个循环来计算,从最大批次开始尝试。


逻辑在哪里?你为第一个订单设定最大允许手数,然后为每个连续的订单增加该手数。说句不好听的,你不觉得这很不理智吗?

此外,你用一些完全无法理解的方法减少循环中第一个订单的手数,而之前 "计算 "过的其他订单的手数保持不变,这些数值没有超出这个函数的极限。那么,他们是怎么做的呢?

更不用说增量循环不能是一个实数,它必须是一个计数器,一个整数。但你把批价设置为一个计数器,每次迭代时从里面减去一个。这是一个重大的错误,一个非常严重的错误。

首先在你的头脑中明确逻辑,然后尝试将其实现在你的代码中。

 
bog_v_nas:

但这里有一些警告。我不明白他不喜欢什么。


由于类型转换可能导致数据丢失 Bolinger_Bands_traider.mq4 51 24
从 "数字 "到 "字符串 "的隐式转换 Bolinger_Bands_traider.mq4 76 35
从 "数字 "到 "字符串 "的隐式转换 Bolinger_Bands_traider.mq4 76 227
从 "数字 "到 "字符串 "的隐式转换 Bolinger_Bands_traider.mq4 77 43
从 "数字 "到 "字符串 "的隐式转换 Bolinger_Bands_traider.mq4 78 43
从 "字符串 "到 "数字 "的隐式转换 Bolinger_Bands_traider.mq4 85 71
从 "数字 "到 "字符串 "的隐式转换 Bolinger_Bands_traider.mq4 93 23
从 "数字 "到 "字符串 "的隐式转换 Bolinger_Bands_traider.mq4 93 91
从 "字符串 "到 "数字 "的隐式转换 Bolinger_Bands_traider.mq4 99 72
从 "数字 "到 "字符串 "的隐式转换 Bolinger_Bands_traider.mq4 107 23
从 "数字 "到 "字符串 "的隐式转换 Bolinger_Bands_traider.mq4 107 91
0个错误(s), 11个警告(s), 编译时间: 204 msec 1 12

输出一行数字51,因为这里没有计数,可以理解为错误" 由于类型转换Bolinger_Bands_traider.mq4 51 24 "的数据可能丢失

其余的:"从'数字'到'字符串'的隐式转换 Bolinger_Bands_traider.mq4 107 91

将数值翻译成我们创建对象的文本字符串--例如,文本字符串

阶段()

它应该是

DoubleToString(Period(),0)

 
Renat Akhtyamov:

将数字值转化为文本字符串,在这里我们创建一个文本字符串对象,比如说

阶段()

它应该是

DoubleToString(Period(),0)


从什么时候开始,周期是一种双倍类型