EA代码2(SL经理)的问题 - 页 3

 

在这个阶段,这个链接在我之上,但是我可以看到我如何做一个很酷的库文件来解决我的问题... https://www.mql5.com/en/articles/1390。我现在对建立票据阵列有点紧张,希望我可以暂时绕过它。因为当我修改时,它只是所有的Pair和Magic等。

在进入修改部分之前,我已经做了所有正确的工作。 它正确地选择了票据,然后通过了修改块......这部分很好。

我只是不知道'如果事情卡在这个修改部分',或者我是否有麻烦,因为它'需要通过这些部分来抓取下一个订单'。

我曾希望我可以把它送到修改块,让它修改那个神奇数字和符号的所有订单。 这就是为什么我尝试了一个小的真或假开关。

如果它需要通过这些部分的每一个勾选 "来选择下一个订单",我可能会有麻烦。

也许我可以手动命名需要修改的票,但我不认为这是个问题,因为它能正确地得到它们,只是每次打勾都会循环,而我是个新手,不知道为什么......

这是否是另一种选择?

 for(int i=1; i<=OrdersTotal(); i++)
     { 
      if (OrderSelect(i-1,SELECT_BY_POS)
       executedpreviously = true;
       while(true)
         {
         modify section is ok...   
          }
        executedpreviously = false;
      }
//or would I declare this back to false elsewhere... 
//I am just not sure if it needs to run here each tick to grab the next order

一个continue;、return()或break;会不会在某个地方有用?

 

啊,我在我之前的一个例子中看到了一个错误......。

if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe) 

我想应该是这样。

bool IfGap_SELLLevel_00AlreadyExe = FALSE; //(this time up in declared varibales before program start)


    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && IfGap_SELLLevel_00AlreadyExe == FALSE)
        { 
            double Level_00_SL = Bid + Stoploss_Level_00*PipValue*Point;
            if (Stoploss_Level_00 == 0) Level_00_SL = 0;
            double Level_00_TP = Bid - Takeprofit_Level_00*PipValue*Point;
            if (Takeprofit_Level_00 == 0) Level_00_TP = 0;
            bool ret00 = OrderModify(OrderTicket(), OrderOpenPrice(), Level_00_SL, Level_00_TP, 0, Modify_Order_Colour);
            IfGap_SELLLevel_00AlreadyExe = TRUE;
            if (ret00 == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
            break;  (EDIT: going to try this break in the morning, pls let me know if I am off track totally anyway)
         }
    }

这应该是将它隔离在那个部分......现在是凌晨5点,所以还没有测试......(损失了一个小时,该死的夏令时哈哈)

如果我让它以一种方式通过这一部分,它就会在每一个tick 上用最新的订单修改订单......如果我让它以另一种方式通过,它就会正常滚动订单,但它仍然在每一个tick上修改订单缓存......。

我可以让订单向后滚动5,4,3,2,1或向前滚动1,2,3,4,5,但我想不出让它通过修改所有订单的方法,而不至于使它们成为垃圾。

我想知道:1)我是否需要让它通过一次来修改所有通过的订单......,或者2)它是否需要在每次需要选择新订单时通过?

我还在学习,就是这样。 如果没有人可以引导我到正确的方向,我将尝试上面这一行,在结尾处有一个中断,看看是否结束....,它必须是简单的东西。

 
IfGap_SELLLevel_00AlreadyExe == FALSE)  this may still compile, but truly speaking, this a "mis-spelt" boolean syntax.

你没有犯任何错误。第一个是好的...。

if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe) <--- this is GOOD to go..


如果我没有看错的话,我以前可能也有过类似的问题。我试图创建我自己的 "修改止损/限制订单 的最低MODE_STOP水平,如果买入/卖出移动x点..."

你的情况类似吗?

 
diostar:

你没有犯任何错误。第一个是好的...。


如果我没有看错的话,我以前可能也有过类似的问题。 我试图创建我自己的 "修改止损/限制订单的最低MODE_STOP水平,如果买入/卖出移动x点..."

你的情况类似吗?



谢谢Diostar,我正试图用挂单做一个堆,然后当它到达下一个成功的挂单时,把旧的止损调出来。

我将再次尝试!......有很多组合可以尝试......我明白了,我应该用 "false "作为布尔值,而不是FALSE......是的,它仍然可以编译和工作,但问题相同。 我可能会再找到那个草案,用 "false "试试。 在例子2中,它不会滚动浏览订单,而且每一个刻度都 会修改,所以我将再次尝试改变这个变量。

我可以让它传递到修改块,并向前或向后旋转订单,但它修改每一个刻度,如果我在修改后加入一个真或假的过滤器,它只修改缓存中的第一个订单....。

对我来说,这表明EA需要在每个tick上获取下一个订单(我不确定当它到达这个区块时,我是否可以把它封在这里,并让它在订单中旋转一次)......

这给我带来了一个问题,因为任何真实或虚假的问题都不能让它通过......

我想如果我学会了如何制作一个订单缓存并通过它们进行选择,我仍然会有同样的问题......我有过所有的组合,但不是同时发生的。 我已经让它修改了一次,然后继续前进,但它只得到了第一个订单就停止了......所以我在想,我是否应该用一个开关来实际指定每张订单......。我不确定我报告错误信息的bool OrderTicket()是否把Pending_OrderTicket_XX的声明也弄乱了。 这一定是个简单的问题。

你是如何解决你的这个问题的?

 
void IfGap_SELLLevel_00()
{
    if (OrderSelect(FirstRunSell_ticket_00,SELECT_BY_TICKET,MODE_TRADES)) 
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01)
        {
            if ((Gap_Level_00 < 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_00*PipValue*Point))
             || (Gap_Level_00 > 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_00*PipValue*Point)))
            {
                SellOrderModifyLevel_00();
            }
        }
    }
    
    
}

void SellOrderModifyLevel_00()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
    {
        if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe) 
        { 
            double Level_00_SL = Bid + Stoploss_Level_00*PipValue*Point;
            if (Stoploss_Level_00 == 0) Level_00_SL = 0;
            double Level_00_TP = Bid - Takeprofit_Level_00*PipValue*Point;
            if (Takeprofit_Level_00 == 0) Level_00_TP = 0;
            OrderModify(OrderTicket(), OrderOpenPrice(), Level_00_SL, Level_00_TP, 0, Modify_Order_Colour);
            IfGap_SELLLevel_00AlreadyExe = true;
            
        }
    }
    
}


不管我如何在全局变量中声明...

bool IfGap_SELLLevel_00AlreadyExe;

......它似乎修改了一次,但只是其中一个订单,我假设是最后一个订单,因为我滚动订单的方式。

我把订单 前的ret00也拿掉了,以防万一......

至少它不是每一个刻度,我可以使用这个例子,如果它仍然滚动我的订单,当第一个论坛的条件是真实的(但不是每一个刻度 "垃圾邮件修改 "后滚动确定,像我最成功的尝试...)。

这个尝试也没有成功。

**sent here first from that other decision, but for Pending Order 5 instead of FirstSell 00 etc...

void SellOrderModifyLevel_05()
{
    for (int i=OrdersTotal()-1; i >= 0; i--)
    if (OrderSelect(i, SELECT_BY_TICKET))
    {
        if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe) 
        { 
            double Level_05_SL = Bid + Stoploss_Level_05*PipValue*Point;
            if (Stoploss_Level_05 == 0) Level_05_SL = 0;
            double Level_05_TP = Bid - Takeprofit_Level_05*PipValue*Point;
            if (Takeprofit_Level_05 == 0) Level_05_TP = 0;
            OrderModify(FirstRunSell_ticket_00, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_01, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_02, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_03, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_04, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            OrderModify(SellPendingOrderTicket_05, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
            IfGap_SELLLevel_00AlreadyExe = true;
            
        }
    }
    
}

我更清楚我在做什么,我希望上面的方法能起作用,如果是这样的话,我就可以完成了......

我希望我是在正确的轨道上。 我还是不明白为什么我前面的例子1是错误的,这个愚蠢的东西正是我想要的,但是每一个刻度... 我甚至不能让它在我编入订单时工作,所以我又完全迷失了。

有什么指点吗?


编辑:我真的很累了,但我刚刚想到了这个问题,不过,由于时间不够了,我得晚点再试试......

void IfGap_SELLLevel_05()
{
    if (OrderSelect(SellPendingOrderTicket_05,SELECT_BY_TICKET,MODE_TRADES)) 
    {
        if (OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01 && !IfGap_SELLLevel_00AlreadyExe)
        {
            if ((Gap_Level_05 < 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid < Gap_Level_05*PipValue*Point))
             || (Gap_Level_05 > 0 && (OrderType() == OP_SELL && OrderOpenPrice() - Bid > Gap_Level_05*PipValue*Point)))
            
             {
              for (int i=OrdersTotal()-1; i >= 0; i--)
              if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
                     {
                     if (OrderType() == OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == SELL_Magic01) 
                      { 
                       double Level_05_SL = Bid + Stoploss_Level_05*PipValue*Point;
                       if (Stoploss_Level_05 == 0) Level_05_SL = 0;
                       double Level_05_TP = Bid - Takeprofit_Level_05*PipValue*Point;
                       if (Takeprofit_Level_05 == 0) Level_05_TP = 0;
                       OrderModify(FirstRunSell_ticket_00, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_01, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_02, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_03, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_04, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       OrderModify(SellPendingOrderTicket_05, OrderOpenPrice(), Level_05_SL, Level_05_TP, 0, Modify_Order_Colour);
                       IfGap_SELLLevel_00AlreadyExe = true;
            
                      }
                }
           }
       }
    
    
}
 

你是在处理小数点吗?

 
diostar:

你是在处理小数点吗?


我想我把SL和TP值增加了一倍,如果你是这个意思的话,这样它就会被分配价格来设置SL和TP。 我希望我这样做没有错。

我只需要MT4到达那个区块,然后忘记它....。我感觉这个表达方式对MT4来说太复杂了,但我会继续尝试......

 
Funky:


我想我把SL和TP值增加了一倍,如果这是你的意思的话,这样它就会被分配到设定SL和TP的价格。 我希望我这样做没有错。

我只需要MT4到达那个区块,然后忘记它....。我感觉这个表达方式对MT4来说太复杂了,但我会继续尝试......

不,我的意思是,你是在处理4/5位数 - 0.0001,还是0.00001点?
 
diostar:
我的意思是,你是在处理4/5位数 - 0.0001,还是0.00001点?


啊,5位数...我早些时候就用这个...

extern bool IsFiveDigitBroker = true;
extern bool DoDetectBrokerDigits = true;
double PipValue=1;
int NDigits = 4; 
// ----

int init()
{
    NDigits = Digits;
}

// ----
init start()

int start()
{
   OnEveryTick();
}
void OnEveryTick()
{
    if (DoDetectBrokerDigits == false && IsFiveDigitBroker) PipValue = 10;
    if (DoDetectBrokerDigits && (NDigits == 3 || NDigits == 5)) PipValue = 10;



    //then I go on to check the IfGaps on every tick...

    IfGap_SELLLevel_00();
    IfGap_SELLLevel_01();
    IfGap_SELLLevel_02();
    IfGap_SELLLevel_03();
    IfGap_SELLLevel_04();
    IfGap_SELLLevel_05();

 }



而我早些时候在想,我可能会尝试把这个Detect Digits作为我的第一个库的插入物,嘿嘿,但是一步一步来,我得先学会爬行,嘿嘿。

我没有收到任何错误信息130价格关闭或任何....。我希望它是像这样简单的东西。

上一页我的例子1在工作,还有很多其他类似的例子,我只是希望能让它在每个tick修改一次......

我不知道我是否应该为他们每个人做一个新的盒子,而不是试图一次获得我以前所有的卖出订单......是的,我真的很迷茫,如何在我的任何尝试中循环查看我所有的旧SELLS,并修改它们一次。


&& (OrderStopLoss() < Stoploss_Level_00)

而不是

!IfGap_SELLLevel_00AlreadyExe

你知道你之前提出的一些建议,Diostart让我思考...

我在想,如果一个!"IfGap_SELLLevel_00AlreadyExe "的想法行不通的话(如果它不打算在我锁定该区块之前,在同一个通道中抓取所有的订单并修改它们),我想如果我使用你之前的想法,并在那里放一个这样的问题... 如果成功的话,我就会弹回来。

如果我走错了路,请让我知道,谢谢;)

 
Funky:


啊,5位数...我在早些时候使用这个...



而我之前在想,我可能会尝试把这个Detect Digits作为我的第一个库插入,嘿嘿,但一步一步来,我得先学会爬行,嘿嘿。<--明智之举。 你正在爬行。有了图书馆,你最终会走路的。

我没有收到任何错误信息130价格关闭或任何....。我希望它是像这样简单的东西。

上一页我的例子1在工作,还有很多其他类似的例子,我只是希望我可以让它在每个tick上修改一次...<---见下图

我不知道我是否应该为每一个卖出的订单做一个新的盒子,而不是试图一次获得所有以前的卖出订单......是的,我真的不知道如何在我的任何尝试中循环所有的旧卖出订单,并修改它们一次。


我希望这可能会提供一些帮助。

最初,我的符号是4位数,所有的跟踪止损,止损/限价单的修改,都是按预期进行的。 然后我的经纪人决定采用小数点。我做了必要的修改,看到我的点数变成了-3.4,-4.5,0.1,4.6,7.3,等等,等等。 我想这是可以的,但实际上不是。假设我设定我的极限=7,然后说,新的tick 1,tick 2,tick 3依次发生。

1) 7.3>限价,然后订单被修改......经纪人填补了1个滑点......

2) 7.5>限价,然后订单被修改....,经纪人填补了0个滑点......

3) 7.1>限制,然后订单被修改...经纪人填补了2个滑点...

因此,总的来说,我的订单在所有3个点上被修改了3次。意识到这一点后,我决定使用MathRound() 将这些订单取整到最近的整数,因此1,2,3变成了

1) mathround(7.3) =7 >limit, NOT TRUE, not modified

2) mathround(7.5)=8 >limit, TRUE, 顺序被修改。

3) mathround(7.1)=7>limit,非真,未被修改。

实际上,我还在研究如何改进上述方法......到目前为止,它们还能工作,但我认为一定有比我更好的方法。