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

 
a196012a:

我完成了你的代码,其中有一个块,用于开立成交量为0.1的订单(就在void start()函数之后)。

但由于某些原因,程序没有打开任何增加的订单(每个0.3手),以回应这些订单的关闭。

我在你的代码中不明白的事情

1.如果我理解正确的话,你只把МН=123分配给有0.3手交易量的订单。

在数据时间函数SearTim(int s)中,你正在寻找一个MH=123但成交量为0.1的订单。

但是成交量为0.1的订单不能有МН=123,因为这个MM只分配给成交量为0.1的订单。

在datetime SearTim(int s)和int sear()函数的正文中,特别是在注释中,有必要以0.3的量开立一个订单。

我不明白为什么我必须在同样的条件下多次开出一个更大的交易量的订单。

你已经在第一块中开出了成交量增加的订单。



如果你能写一些代码,在关闭每个0.1的订单后,开一个0.3的订单,并保持0.1的值,我将非常感谢你。

在这种情况下,我将尽力在你的代码中找到所有问题的答案,借助Print()函数、我微薄的知识和参考书的帮助。

注意:

我有相同类型的订单,成交量为0.1和0.3 - 只有SEL。这就是为什么如果我没有弄错的话,我们不必在int sear()函数中计算订单类型(BAY或SEL)。

我想再次提醒你,我的程序的最终目标是记住0.1订单在其收盘价被0.3订单平仓后的小时值(不是一分钟,不是一秒钟,而只是一个小时),该订单在SL上平仓。


我很抱歉,我不能向你解释太多,因为你必须了解编程语言。我认为你已经是一个程序员了,我是在依靠一个懂得编程的人。

你必须先学习编程。如果我向你解释什么和怎么做,那就是学习一种编程语言。

看看EA的例子,它们是如何编写的,并尝试从一开始就编写程序。而你正试图编写一个已经很复杂的程序。

看一下如何编写命令和示例模块的教程和例子。

附加的文件:
MQL4.zip  2226 kb
 

我解决这个不复杂的问题,这里是收尾的部分。

当一个订单的利润变成正数时,它就关闭该订单,在这整个利润的基础上,有可能出现多少亏损的情况。如果启用了Perekr。


我们必须改变它,只有当盈利头寸的利润覆盖了亏损头寸的所有损失时,它才会关闭两个头寸,也就是说,一个订单的利润等于或大于另一个订单的损失。

if(Mas_Tip[1]>0)

     {

      if(Bidt-step*Point>=NormalizeDouble(Bid,Digits))

        {

         Profit=AccountBalance()-StartProfit;

         Askt=NormalizeDouble(Ask,Digits);

         Bidt=NormalizeDouble(Bid,Digits);

         for(int i=1; i<=OrdersTotal(); i++)

           {

            if(OrderSelect(i-1,SELECT_BY_POS)==true && OrderType()==OP_SELL && 

               OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)

              {

               if(Razn<2)

                 {


                  if(Perekr && OrderProfit()>0 && max_lot>=Lots_per) //перекрытие

                    {

                     double profit=OrderProfit();

                     Print("закрываю по перекрытию");


                     ClosePosBySelect(OrderLots());

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

                       {

                        if(OrderSelect(f,SELECT_BY_POS)==true && OrderType()==OP_BUY && 

                           OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)

                          {

                           if(OrderProfit()<0)

                             {

                              if(profit>=MathAbs(OrderProfit()))

                                {

                                 Print("закрываю по перекрытию");


                                 ClosePosBySelect(OrderLots());

                                }

 

朋友们,你们好。我需要一个新手的帮助。

我想通过电子邮件收到一些指标与价格交叉的通知。我已经明白怎么做了,但是一旦穿越完成,我就会收到数以百计的电子邮件,而且它们会无限期地发送下去,直到当前的蜡烛关闭。怎样才能做到只发一条信息?下面是一个例子。

if((iSAR(NULL, 0,Step,Maximum, 1)<iClose(NULL,0,1))&&(iSAR(NULL, 0,Step,Maximum, 2)>iClose(NULL, 0,2))){

bool res = SendMail("Buy Signal", "Buy Signal");

}


if((iSAR(NULL, 0,Step,Maximum, 1)>iClose(NULL,0,1))&&(iSAR(NULL, 0,Step,Maximum, 2)<iClose(NULL, 0,2))){

SendMail("Sell Signal", "Sell Signal");

}

 
ev85:

朋友们,你们好。我需要一个新手的帮助。

我想通过电子邮件收到一些指标与价格交叉的通知。我已经明白怎么做了,但是一旦价格交叉完成,我就会收到数百封邮件,而且它们会无限期地发送下去,直到当前的蜡烛收盘。怎样才能做到只发一条信息?下面是一个例子。

if((iSAR(NULL, 0,Step,Maximum, 1)<iClose(NULL,0,1))&&(iSAR(NULL, 0,Step,Maximum, 2)>iClose(NULL, 0,2))){

bool res = SendMail("Buy Signal", "Buy Signal");

}


if((iSAR(NULL, 0,Step,Maximum, 1)>iClose(NULL,0,1))&&(iSAR(NULL, 0,Step,Maximum, 2)<iClose(NULL, 0,2))){

SendMail("Sell Signal", "Sell Signal");

}

用抛物线很简单,在条件中放一个标志。或者一个简单的int类型 的变量,其值随每个信号的变化而变化。

static bool flag;
 if(flag && iSAR(NULL, 0,Step,Maximum, 1) < iClose(NULL,0,1) && iSAR(NULL, 0,Step,Maximum, 2) > iClose(NULL,0,2)){

 bool res = SendMail("Сигнал на покупку",  "Сигнал на покупку");
 flag = false;
 }


 if(!flag && iSAR(NULL, 0,Step,Maximum, 1) > iClose(NULL,0,1) && iSAR(NULL, 0,Step,Maximum, 2) < iClose(NULL,0,2)){

 SendMail("Сигнал на продаж",  "Сигнал на продажу");
 flag = true;
 }
 

大家好,能否请你们帮助我解决追踪止损的问题。我写了一个追踪止损,条件是我最初的SL=100,追踪止损应该在价格高于开仓30点时触发。但它在开仓后立即进行修改,将标准SL改为30,然后再移动。

空白的拖尾()

{

int SLoss = 1;

double StopL = NormalizeDouble (OrderOpenPrice() + SLoss*Point, Digits);

double StopL2 = NormalizeDouble (OrderOpenPrice() - SLoss*Point, Digits);

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

{

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

{

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

{

如果(OrderType() == OP_BUY && OrderStopLoss() >= StopL)

{

如果(Bid - StopL > TrailingStop*Point)

{

如果(OrderStopLoss()< Bid-(TrailingStop+TrailingStep)*Point)

{

if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Bid-TrailingStop*Point, Digits), 0, 0))

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

}

}

}

如果(OrderType() == OP_SELL && OrderStopLoss() <= StopL2)

{

如果(StopL2 - Ask > TrailingStop*Point)

{

如果(OrderStopLoss()> Ask+(TrailingStop+TrailingStep)*Point)

{

if(!OrderModify(OrderTicket(), OrderOpenPrice(), NormalizeDouble(Ask+TrailingStop*Point, Digits), 0, 0))

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

}

}

}

}

}

}

}

 
Alexey Viktorov:

对于抛物线来说,这很简单,在条件中放一个标志。或者一个简单的int类型的 变量,其值随每个信号的变化而变化。

只需忘记else - 否则,静态变量在第一个信号后保持为真。
 
AlGuru:

大家好,能否请你们帮助我解决追踪止损的问题。我写了一个追踪止损,条件是我最初的SL=100,追踪止损应该在价格高于开仓30点时触发。它将在开仓后立即修改,并将标准SL改为30,然后移动它。

...
它可能有什么帮助?我在那里贴了一个模板,你可以根据这个模板自己制作你想要的东西。
 
Artyom Trishkin:
只是忘记了else--否则静态变量在第一个信号后保持为真。

里面的Elza有什么意义?我认为flag == true;或者flag == false;这在代码中是这样的

if(flag && ****

if(! flag && ****

如果一侧有一个交叉点,我们就等待另一侧的交叉点......就这样,这个循环被关闭了。但如何在一开始就正确连接,让他自己去想。或者以后问他...

 
Alexey Viktorov:

为什么有一个杰尔萨在那里?我认为flag == true;或者flag == false;这在代码中是这样的

当穿越到一边时,我们等待着穿越到另一边............于是,这个循环就结束了。但如何在一开始就正确连接,让他自己去想。或者以后问他...

如果在一个方向的不同条上有两个信号?

你只有摆动。

但在有信号的时候,应该始终发送信号,但发出信号的决定是单独作出的。

在我看来,每个方向都有自己的旗帜,并且来回切换,这将是最理想的。但不是让一个方向的信号取决于相反方向的信号。

 
Artyom Trishkin:

如果两个信号是在同一方向的不同条形上?

你只得到一个摆动。

但在有信号的时候,应该始终发送信号,但发出信号的决定是单独作出的。

在我看来,每个方向都有自己的旗帜,并来回切换是最理想的。但不是让一个方向的信号取决于相反方向的信号。

阿特姆,我在给你的答复中首先说了以下的话

抛物线有严格的交替性,一个方向的两个信号,即使在不同的柱子上,也是不可能的。而且根本不需要为此发明什么,即使像MA那样在零杆上也不会发出响声。

原因: