新人对MQL4和MQL5的任何问题,对算法和代码的帮助和讨论 - 页 349

 

是否可以通过iCustom向指标传递动态输入参数?当我试图这样做时,每一个新的动态输入参数都会打开一个新的指标窗口。

   if(NewBarCur())BulsPeriod++;
   double sep_window=iCustom(Symbol(),PERIOD_CURRENT,"Bulls",BulsPeriod,0,0);
 
还有这个问题,有没有办法知道,比如说,测试图上还剩下1个柱子或3分钟?
 
Artyom Trishkin:

在这个主题中,我想开始帮助那些真正想了解和学习新的MQL4的编程,并想轻松切换到MQL5的人--这些语言非常相似。

这将是一个讨论任务、解决任务的算法以及与MT编程相关的任何其他问题的好地方,不管是哪种方式。

我希望我们论坛的其他有经验的成员会加入我们,这个主题会让大家感兴趣。


阿尔乔姆-特里什金

在这个分支中,我想开始帮助那些真正想了解和学习新的MQL4的编程,并想轻松切换到MQL5的人--这些语言非常相似。

这将是一个讨论问题、算法和有关MT编程的任何其他问题的好地方。

我希望我们论坛的其他有经验的成员能和我们一起解决这些问题,这个话题会引起大家的兴趣。


阿尔乔姆-特里什金

在这个分支中,我想开始帮助那些真正想了解和学习新的MQL4的编程,并想轻松切换到MQL5的人--这些语言非常相似。

这将是一个讨论问题、算法和有关MT编程的任何其他问题的好地方。

我希望我们论坛的其他有经验的成员能加入我们,这个话题会让大家感兴趣。


阿尔乔姆-特里什金

在这个分支中,我想开始帮助那些真正想了解和学习新的MQL4的编程,并想轻松切换到MQL5的人--这些语言非常相似。

这将是一个讨论问题、算法和有关MT编程的任何其他问题的好地方。

我希望我们论坛的其他有经验的成员能加入我们,这个话题会让大家感兴趣。


阿尔乔姆-特里什金

在这个分支中,我想开始帮助那些真正想了解和学习新的MQL4的编程,并想轻松切换到MQL5的人--这些语言非常相似。

这将是一个讨论任务、其解决方案的算法和任何其他与MT编程有关的问题的好地方,不管是哪种方式。

我希望我们论坛的其他有经验的成员能加入我们,这个话题会让大家感兴趣。


荩忱

阿尔乔姆-特里什金

我想从这一章开始,帮助那些真正想了解和学习新的MQL4的编程,并想轻松切换到MQL5的人--这些语言非常相似。

这是一个讨论任务、解决任务的算法以及任何其他与MT编程有关的问题的地方。

我希望我们论坛的其他有经验的成员能和我们一起解决这些问题,这个话题会引起大家的兴趣。


帮助我,我在我的EA中添加了追踪止损功能,我测试了一下,它给了我两个错误。- 我不知道如何修复它们。然而交易在价格分别触及通道的上限和下限后,根据旧的策略被关闭。我想这里也必须要改变一些东西。- 回电给dnr军队的人。

#property copyright "Copyright 2017, MetaQuotes Software Corp.

#属性链接 "https://www.mql5.com"

#财产版本 "1.00"

#属性严格


//---------------------------------------------------------

外来的双倍Lots = 0.01。

外置 int TakeProfit = 600;

外来的int StopLoss = 25;

外来的int Magic = 0001;

外置 int Slippage = 3;

extern int TralType = 0; // 0-SAR, 1-ATR, 2-HMA.

外部双SAR_Step = 0.02。

外置双SAR_Max = 0.2。

外置 int ATR_Period = 14;

外置双倍ATR_K = 2.0。

外来的HMA_Period = 16。

外部实习生HMA_Method = 3;

外部inttern HMA_Shift = 0;

datetime LBT;

//---------------------------------------------------------

extern string TMA = "TMA指标参数"。

外部字符串 TimeFrame = "当前时间框架"。

外置 int HalfLength = 56;

外部int Price = "PRICE_CLOSE;

外置双倍ATRMultiplier = 2.0。

外部的ATRPeriod = 100。

外部 bool Interpolate = true。

//---------------------------------------------------------

双重PriceHigh, PriceLow, SL, TP。

int票。


//+------------------------------------------------------------------+

//|专家初始化功能|

//+------------------------------------------------------------------+

int OnInit()

{

如果(Digits == 3 || Digits == 5)

{

TakeProfit *= 10。

StopLoss *= 10;

滑移*=10。

}

return(INIT_SUCCEEDED)。

}

//+------------------------------------------------------------------+

//|专家去初始化函数|

//+------------------------------------------------------------------+

空白的OnDeinit(const int reason)。

{


}

//+------------------------------------------------------------------+

//|专家勾选功能|

//+------------------------------------------------------------------+

空白的OnTick()

{

PriceHigh = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 1, 0);

PriceLow = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 2, 0);

如果(CountSell() == 0 && Bid >= PriceHigh)

{

ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "TMA robot", Magic, 0, Red);

如果 (ticket > 0)

{

SL = NormalizeDouble(Bid + StopLoss*Point, Digits)。

TP = NormalizeDouble(Bid - TakeProfit*Point, Digits)。

如果(OrderSelect(ticket, SELECT_BY_TICKET))

如果(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))

Print(" 订单修改错误!")

}

}

如果(CountBuy() == 0 && Ask <= PriceLow)

{

ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "TMA robot", Magic, 0, Blue);

如果 (ticket > 0)

{

TP = NormalizeDouble(Ask + TakeProfit*Point, Digits)。

SL = NormalizeDouble(Ask - StopLoss*Point, Digits);

如果(OrderSelect(ticket, SELECT_BY_TICKET))

if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))

Print("修改买入订单错误!")

} else Print("打开买入订单出错")。

}

//+------------------------------------------------------------------+

//|专家初始化功能|

//+------------------------------------------------------------------+

int init()

{

//--------


//--------

返回(0)。

}

//+------------------------------------------------------------------+

//|专家勾选功能|

//+------------------------------------------------------------------+

空白的OnTick()

{

PriceHigh = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 1, 0);

PriceLow = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 2, 0);

如果(CountSell() == 0 && Bid >= PriceHigh)

{

ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "TMA robot", Magic, 0, Red);

如果 (ticket > 0)

{

SL = NormalizeDouble(Bid + StopLoss*Point, Digits)。

TP = NormalizeDouble(Bid - TakeProfit*Point, Digits)。

如果(OrderSelect(ticket, SELECT_BY_TICKET))

如果(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))

Print("修改卖出订单错误!")

} else Print("打开卖出订单出错!")

}

如果(CountBuy() == 0 && Ask <= PriceLow)

{

ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "TMA robot", Magic, 0, Blue);

如果 (ticket > 0)

{

TP = NormalizeDouble(Ask + TakeProfit*Point, Digits)。

SL = NormalizeDouble(Ask - StopLoss*Point, Digits);

如果(OrderSelect(ticket, SELECT_BY_TICKET))

if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))

Print("修改买入订单错误!")

} else Print("打开买入订单出错")。

}

如果(Ask <= PriceLow && CountSell() > 0)

{

for (int i = OrdersTotal() -1; i>0; i--)

{

如果(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

如果(OrderMagicNumber() == Magic && OrderType() == OP_SELL)

如果(!OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Black))

Print("OrderClose卖单错误!")

}

}

}

如果(Bid >= PriceHigh && CountBuy() > 0)

{

for (int i = OrdersTotal() -1; i>0; i--)

{

如果(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))

{

如果(OrderMagicNumber() == Magic && OrderType() == OP_BUY)

if(!OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Black))

Print("OrderClose Buy error!)

}

}

}

}

//+------------------------------------------------------------------+

int CountSell()

{

int count = 0。

for (int trade = OrdersTotal()-1; trade>=0; trade--)

{

如果(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))

{

如果(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_SELL)

count++。

}

}

return(count)。

}//+------------------------------------------------------------------+

int CountBuy()

{

int count = 0。

for (int trade = OrdersTotal()-1; trade>=0; trade--)

{

如果(OrderSelect(trade, SELECT_BY_POS, MODE_TRADES))

{

如果(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == OP_BUY)

count++。

}

}

return(count)。

}

//+------------------------------------------------------------------+

//|专家去初始化函数|

//+------------------------------------------------------------------+

int deinit()

{

//+-------


//+-------

返回 (0)

}

//+------------------------------------------------------------------+

//|专家启动功能|

//+------------------------------------------------------------------+

int Start()

{

//-----

bool error = fals;

如果(LBT!=Time[0]) {

如果(OrdersTotal()!=0) {

for (int i=0; i<OrdersTotal(); i++){

如果(OrderSelect(i,SELECT_BY_POS)&&OrderSymbol()==Symbol()&&OrderType()<2){

double SL = OrderStopLoss();

如果OrderType()==0) {

switch (TralType) {

case 0: SL = iSAR(NULL,0,SAR_Step,SAR_Max,0);

突破。

case 1: SL = High[1] - iATR(NULL,0,ATR,Period,1)*ATR_K;

突破。

case 2: SL = iCustom(NULL,0, "VininI_HMAsound&amp",HMA_Period,HMA_Method,3,HMA_Shift,fals,fals," ,1,0,0)。

突破。

}

如果(SL<OrderStopLoss())

SL = OrderStopLoss()。

}

如果(OrderType()==1) {

switch (TralType) {

case 0: SL = iSAR(NULL,0,SAR_Step,SAR_Max,0);

突破。

case 1: SL = Low[1] + iATR(NULL,0,ATR,Period,1)*ATR_K;

突破。

case 2: SL = iCustom(NULL,0, "VininI_HMAsound&amp",HMA_Period,HMA_Method,3,HMA_Shift,fals,fals," ,1,0,0)。

突破。

}

如果(SL>OrderStopLoss())

SL = OrderStopLoss()。

}

如果(SL!=OrderStopLoss()){

if(!OrderModify(OrderTicket(),OrderOpenPrice(),SL,OrderTakeProfit(),0))

error = true。

}

}

}

}

if (!error)

LBT = Time[0]。

}

返回(0)。

}

//+------------------------------------------------------------------+

 
vkravtzov:

学习如何插入代码!!!


学习插入代码!!!


学习如何插入代码!!!


学习如何插入代码!!!


学习如何插入代码!!!


学习如何插入代码!!!


学习如何插入代码!!!


学习如何插入代码!!!


学习如何插入代码!!!


学习插入代码!!!

 
vkravtzov: 请帮助我理解,我在专家顾问中添加了追踪止损功能,我测试了一下,它给了我两个错误。- 我已经破解了我的大脑,我无法想出如何修复它们。然而交易在价格分别触及通道的上限和下限后,根据旧的策略被关闭。我想这里也必须要改变一些东西。- 回电给dnr军队中的人。

决定提供帮助。但我有问题要问作者--你有这两个初始化函数--它们是做什么的?

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
{
   if (Digits == 3 || Digits == 5)
   {
   TakeProfit *= 10;
   StopLoss   *= 10;
   Slippage   *= 10;
   }
   return(INIT_SUCCEEDED);
}


//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//--------
//--------
    return (0);
    }

有两个OnTick()函数.... 和第三个函数int Start() - 所有这些都是随着tick的到来而执行。终端将以何种顺序启动它们?

错误:OnTick()函数 的结尾处缺少一个大括号。

//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
{
  PriceHigh = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 1, 0);
  PriceLow  = iCustom(NULL, 0, "TMA_Fair", TimeFrame, HalfLength, Price, ATRMultiplier, ATRPeriod, Interpolate, 2, 0);
  if(CountSell() == 0 && Bid >= PriceHigh)
  {
     ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "TMA robot", Magic, 0, Red);
     if (ticket > 0)
     {
        SL = NormalizeDouble(Bid + StopLoss*Point, Digits);
        TP = NormalizeDouble(Bid - TakeProfit*Point, Digits);
        if (OrderSelect(ticket, SELECT_BY_TICKET))
           if (!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
                Print("Ошибка модификации ордера на продажу!");
     }
  }
  if (CountBuy() == 0 && Ask <= PriceLow)
  {
     ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "TMA robot", Magic, 0, Blue);
     if (ticket > 0)
     {
        TP = NormalizeDouble(Ask + TakeProfit*Point, Digits);
        SL = NormalizeDouble(Ask - StopLoss*Point, Digits);
        if (OrderSelect(ticket, SELECT_BY_TICKET))
            if(!OrderModify(ticket, OrderOpenPrice(), SL, TP, 0))
                Print("Ошибка модификации ордера на покупку!");
     }   else Print("Ошибка открытия ордера на покупку");
   }
}    // Эту скобку добавил !!!!!!!!!!!!!!!!!!!!!!!!!

现在,编译器已经检测到8个错误。我删除了.

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//--------
//--------
    return (0);
    }


//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
{
//+-------
//+-------
   return (0);
   }

现在有7个错误。

我在if(OrderType()==0)后面用括号代替了if(OrderType()==0)--出现了8个错误

iATR(NULL,0,ATR,Period,1) - 我们需要iATR(NULL,0,ATR_Period,1) - 发生2个错误。

bool error = fals; 我们需要 bool error = false; - 错误变成了 3

我们在哪里可以得到VininI_HMAsound&amp指标? 有哪些参数? =错误仍然会是1

而你为什么要在三个地方问一个问题呢?

 

帮助下载和安装mt4上的免费EA和信号,而不是像neemogu那样找到下载的视频,只有如何安装,但没有下载。告诉我去哪里找

 
vovik36 Степанов:

帮助下载和安装mt4上的免费EA和信号,而不是像neemogu那样找到下载的视频,只有如何安装,但没有下载。请告诉我去哪里找。

先毕业,再来。

 
Artyom Trishkin:

那又如何呢?


   for(i=pos; i<rates_total && !IsStopped(); i++)
     {
      double dmin=1000000.0;
      double dmax=-1000000.0;
      for(k=i-InpKPeriod+1; k<=i; k++)
       {double ima=iMA(Symbol(),1,60,0,1,0,k);
         if(dmin>ima)  dmin=ima;
         if(dmax<ima)  dmax=ima;
                   Comment(ima);
        }
      ExtLowesBuffer[i]=dmin;
      ExtHighesBuffer[i]=dmax;
     }

你好。你能告诉我为什么它看不到ima=iMA(Symbol(),1,60,0,1,0,k)评论中显示的报价比这一行本身高得多。这是最小和最大值不能正确计算的原因。

 
Rustam Bikbulatov:

你好。你能告诉我为什么它没有看到ima=iMA(NULL,60,24,0,1,0,k)评论中显示的报价比这一行本身高得多。这就是最小值和最大值不能正确计算的原因。

iMA的编号与时间序列一样,0是最相关的数字。在你的案例中,情况可能正好相反
 
Maxim Kuznetsov:
iMA的编号与时间序列一样,0是最相关的数字。而你的情况可能恰恰相反。

这是个无意的赌注。这并没有改变什么。非常重要的一点是,它显示的是不正确的k!

原因: