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

 
Funky:

嗨,猛禽,再次感谢。

1. 上述代码的唯一问题是什么?我认为最坏的情况是,PendingOrderTicket_1不会被修改,会在其SL处关闭。

2. 2.我使用OrderSelect函数的方式可以吗?

我想我遇到的最大问题是,当OrderTicket_1超过第一个Gap_Level1时,它仍然会在满足这个标准时修改订单。

3. 情况是这样吗? 如果是这样,下面的代码能解决这个问题吗?

再次感谢;)

1. 这只是一些让我眼前一亮的东西,会破坏你的代码。


2. 你的OrderSelect是错误的(https://docs.mql4.com/trading/OrderSelect),如果你要用票号来选择,你必须使用SELECT_BY_TICKET 而不是SELECT_BY_POS

3. 我不这么认为,你所做的,我想,只是意味着那个函数只被调用一次 ......当你有下一个需要修改的订单时会发生什么? 如果你有两个订单同时打开会发生什么?

我不是百分之百了解你在做什么,我没有时间详细查看你的代码,但我有一个问题。

你不能看一下订单的OrderOpenPrice(), OrderStopLoss()和OrderTakeProfit(),并确定它是否已经 被修改为1级2级或3级?

 
RaptorUK:

1. 这只是一些跳出来的东西,会破坏你的代码。


2. 你的OrderSelect是错误的(https://docs.mql4.com/trading/OrderSelect),如果你要用票号来选择,你必须使用SELECT_BY_TICKET 而不是SELECT_BY_POS

3. 我不这么认为,你所做的,我想,只是意味着那个函数只被调用一次 ......当你有下一个需要修改的订单时会发生什么? 如果你有两个订单同时打开会发生什么?

我不是百分之百了解你在做什么,我没有时间详细查看你的代码,但我有一个问题。

你不能看一下订单的OrderOpenPrice(),OrderStopLoss()和OrderTakeProfit(),并确定它是否已经 被修改为1、2或3级?

谢谢你,Raptor,你的洞察力对我很有帮助......

我也完全理解时间的限制,你的时间和建议非常值得赞赏....。我并不是想让别人帮我写,所以我没有说得很详细......这就出现了一个问题,没有很多细节,就很难提供帮助,所以请原谅.....。 在这个例子中,我更关心的是学习时的代码,你的提示对我很有帮助。

1.我一直在破釜沉舟地把它放在一起测试,所以可能会在以后更有经验的时候解决断电的问题。

2.我将改成SELECT_BY_TICKET,而不是POS,非常感谢你。

3. 我确实希望GAP_Level1只被调用一次,所以也许我把它串起来的方式是正确的....。 为了回答你的问题,我正试图查看最新的挂单票据,看看它是否超过了我的TradeUp标记。 当这种情况发生时,我希望它能把我以前的所有订单都拖上去(这次是通过选择神奇的数字来获得它们)......在这个阶段,我有另一个待定订单,当它到达Gap_Level2时,我将有一个BuyModify_Level2块,同样的代码....。 这是否合理?

我希望我写的是我的逻辑,这次我真的像你建议的那样,坐下来用纸把它写出来......;)

 
Funky:


3. 我确实希望GAP_Level1只被调用一次,所以也许我把它串起来的方式是正确的....。 为了回答你的问题,我正试图查看最新的挂单票据,看看它是否超过了我的TradeUp标记。 当这种情况发生时,我希望它能把我以前的所有订单都拖上去(这次是通过选择神奇的数字来获得它们)......在这个阶段,我有另一个待定订单,当它到达Gap_Level2时,我将有一个BuyModify_Level2块,同样的代码....。 可行吗?


你将如何(或在你的代码中)设置HasBeenExecuted = false;以便 IfGap_Level_1() 在第二组交易中被执行?
 
RaptorUK:
你将如何(或在你的代码中哪里)设置HasBeenExecuted = false;以便 IfGap_Level_1() 在第二组交易中被执行?

好问题,伙计。

我打算在我导出的内部变量下面,在内部变量的开头,把这个变量变成ool。 我打算做一个GAP_Level_1, GAP_Level_2,GAP_Level_3, GAP_Level_4, GAP_Level_5等。 因此,一旦它达到GAP_Level_1,它就可以忘记这第一个缺口级别。

你的观点确实让我思考,非常感谢。 我现在确实看到了一个问题。

我意识到,当一个交易达到SL,并重新开始时,我确实想让第一个交易再次寻找Gap_Level_1并轮流进行。 而该死的是,这将导致一个问题,因为我打算将PendingOrder_1与GAP_Level_1,PendingOrderLevel_Level_2与GAP_Level2联系起来。

我想我还是可以做到的,但我不会想到这一点,除非你提到.....。

我可以想到三个变通办法...... 第一个更适合我的脑力,哈哈;)

1.如果我选择IF LAST TRADE IS LOSS,那么删除所有挂单,并在交易达到SL时重新启动它们。 因此,挂单1进入Gap Level_1,它将阻止Pending_Order5成为下一笔进入GAP_Level5的交易。 在SL被击中后,我所有的未平仓交易都将被关闭,因为它们都共享同一个SL,所以关闭我的挂单并重新启动逻辑可能是可以的。

2.我能想到的另一个选择(感谢你几周前对我另一个代码问题的提示),是在第一笔交易完成后插入一个布尔变量,称为NEWTRADE,然后有一个块IFNEWTRADE==1,然后去GAP_Level1。 这让我想到,我想我可以在挂单1区块中输入IFNEWTRADE1,在挂单2区块中输入IFNEWTRADE2,以此类推...然后IFNEWTRADE2==1进入GAP_Level2。

编辑(喝了杯咖啡后):3.我刚刚想到,如果我按时间对订单进行排序(现在我知道可以用很多方式对多个订单进行排序),并根据时间分配一个名为ORD_SELECT_NUMBER的互斥变量,会怎么样? 然后在ORD_SELECT_NUMBER == 1之后,转到GAP_Level1,然后使用ORDER_SELECT_NUMBER ++命令查看下一个ORD_SELECT_NUMBER。

我可以根据信号等编写单笔订单的EA,只是这种多笔订单的东西真的让我很难受...... 我的EA实际上是按原样工作的,而且得到了很好的结果,只是使用起来很疯狂,因为它在每一个TICK上都进行修改,而且目前只是使用我最小的Gap_Level,因为我正在研究如何将上面所有的东西结合起来......

哇,但再次感谢Raptor,除了编码知识,我也看到了良好的逻辑是多么重要,谢谢你让我思考。

 
Funky:

哇,但再次感谢Raptor,除了编码知识外,我看到良好的逻辑性也很重要,谢谢你让我思考。

你搞错了......所有的软件,无论用什么语言编码,C++、Perl、Pascal、Fortran、Assembler等等,都是为了解决问题。 如果你的解决方案背后的逻辑是有缺陷的,那么你是一个多么好的编码者也就不重要了 ......解决方案是第一位的,代码是后来的。
 
RaptorUK:
你搞错了......所有的软件,无论用什么语言编码,C++、Perl、Pascal、Fortran、Assembler等等,都只是为了解决问题。如果你的解决方案背后的逻辑是有缺陷的,那么不管你是一个多么好的编码者, ......解决方案是第一位的,代码是后来的。

我明白你的意思...一个没有建筑计划的建筑商是走不远的,即使他是世界上最好的建筑商。最初的计划几乎更重要,我明白你的意思。

你对我的帮助很大,猛禽,想再次表示感谢。

我选择了上面的懒人方案1。

这已经是几个小时的编程了,我的EA在85K左右(因此只贴了一个片段),所以我还没有汇报这个恐龙完成后的情况。我现在的运气相当好,订单选择正确。我正在研究,因为这与我习惯于写的单笔订单的EA相去甚远。我在这个项目中跳进了独立水域,学习如何游泳。我将公布我的进展情况。

再次感谢Raptor :)

 
Funky:

我明白你的意思...一个没有建筑计划的建筑商是走不远的,即使他是世界上最好的建筑商。最初的计划几乎更重要,我明白你的意思。

你对我的帮助很大,猛禽,我想再次表示感谢。

我选择了上面的懒人方案1。

这已经是几个小时的编程了,我的EA在85K左右(因此只贴了一个片段),所以我还没有汇报这个恐龙完成后的情况。我现在的运气相当好,订单选择正确。我正在研究,因为这与我习惯于写的单笔订单的EA相去甚远。我在这个项目中跳进了独立水域,学习如何游泳。我将公布我的进展情况。

再次感谢Raptor :)

一旦你看到自己的代码资源在扩大,并且有一些功能 可以成为未来任何EA使用的通用功能,请考虑使用库/包括等。

一旦它成长为暴龙,你的代码就会迷失在他们自己的Juraissic公园里,特别是当你需要他们再次用于任何未来的使用。

 
diostar:

一旦你看到自己的代码资源在扩大,并且有一些功能可以为任何未来的EA所使用,请考虑使用库/包括等。

一旦它成长为暴龙,你的代码就会迷失在他们自己的Juraissic公园里,特别是当你需要他们在未来使用时。



哈哈,伙计,这让我感到好笑。我知道这怎么可能发生。

说实话,我找到了一个名为 "OrderSendReliable.mqh "的插入库。我打算先完成这个EA,然后再把我如何使用这个库插入物和其他EA代码的帖子发回去,因为我相信它可能会解决热市的问题。

我笑了笑,因为我现在可以看到,随着经验的积累,在EA的顶部会有各种各样的#includes,哈哈,而且你为每个EA携带了1mb的缓存文件。

你知道你的评论让 我思考,它只是去点击。当我得到一个我喜欢的{section}时,我就在我的EA之间剪切和粘贴代码,并把它们绑在一起(例如,那个{section}。我在之前提到的另一篇文章中遇到了麻烦)。我甚至没有想过要把它作为一个库的插入,只是参考它......。我离这种事情还有很长的路要走......我正准备在这个EA之后开始我的第一个库包括那个,看看它们是如何工作的....,可能性是如此之大。这个MQL相当令人上瘾。

哦,对了,我的代码也都上了轨道,它完美地实现了它的目的,我突然回来给一个很大的感谢:)..

我真的很感谢你们的支持,我希望我可以用语言来描述我的感受;)

 

你可以有自己的几套 "核心 "库函数,我强烈建议你早点考虑,而不是以后。

我也是从我的第一个EA开始的,同样的事情,复制、粘贴、复制粘贴....。

转折点是当我为我已经退休的老兵做这个EA时。这改变了一切,我第一次开始使用图书馆。

直到今天,我仍然保留着那个图书馆。如果它能为你提供想法,帮助你继续......这里是它的标题,伙计。

#define PI              3.1415629
#define GOLDEN_RATIO    1.618

#import "command.ex4"
   bool     isInit();
   bool     isFractional(string ins);
   bool     isOrderLimit(int cap);
   bool     isRiskLimit(double risk);
   
   int      ioSession(int h);
   string   ioWkday(datetime d);
   double   ioOrderPriceLvl(string ins, int type, double oPrice);    
   double   ioPriceLvl(string ins,double dPrice);
   bool     ioTrailStop(string ins, int tkt, int type, double oPrice,int lvl, double stop=0);
   int      ioTotalOrd(int magic);
         
   int      opClose(string ins,int ticket,int cmd,double lLot,bool Activate.NO_BREAK_ONE=false);
   int      opOpen(string ins, int cmd, double lLot, double lPrice, double lLoss, double lProfit, string comment,int EA.Id, int lSlip=0, bool Activate.NO_BREAK_ONE=false);
   int      opModify(string ins, int ticket,int cmd,double lPrice,double lLoss,double lProfit,bool Activate.NO_BREAK_ONE=false);   
   double   opStopLvl(string ins,double p);
   double   opNorm(string ins,double price);
   double   opNormL(string ins,double d);   
   double   opPoint(string ins);
   
   double   intelLot(string market, double risk,double stop); 
   double   intelCorrel(string s1,string s2, int f, int type);   
   int      intelPriceMove(string ins, int p, int L);
   int      intelTrend(string ins, int p, int q);   
#import

希望这对你有帮助....

 
diostar:

你可以有自己的一套 "核心 "库函数,我强烈建议你早点考虑,而不是晚点。

我也是从我的第一个EA开始的,同样的事情,复制、粘贴、复制粘贴....。

转折点是当我为我已经退休的老兵做这个EA时。 这改变了一切,我第一次开始使用库。

直到今天,我仍然保留着那个图书馆。 如果它能为你提供思路,帮助你上路......这里是它的标题,伙计。

希望这对你有帮助....


嗨,Diostar,这真的很酷,谢谢你分享这些信息,我还没有阅读过图书馆。 这似乎是一个很好的方法,可以随身携带变量,并为以后预定义它们。 我将考虑一下这个问题。 我喜欢你说的 "早而不晚",我喜欢这样的提示,谢谢伙计。 这让我想起了学习吉他,当20年后我想我希望我从一开始就做 "这样那样 "的事情,这将使过去的20年更容易,笑。 我将认真研究这个问题,谢谢你。

就在我以为自己已经火力全开的时候,我又遇到了一个难题,我想不出该如何解决。 我在选择这两个连接部分的正确顺序方面遇到了麻烦。

我可能会展示我的两个例子,并展示其效果,但我的大脑就是不愿意去点击这个例子......

例子1:

准确地按照我的要求滚动以前的订单,但是它在每一次点击时都会修改它们。

(原来的戏剧性的顺序选择Raptor帮助我停止了水平的冲突,所以SL也是由于这个原因而滑动的。 我觉得这最后一部分很容易解决,但已经处理了好几天了,我觉得要阻止它每一次 的发生...)

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)))
            {
                IfGap_SELLLevel_00AlreadyExe = false;
            }
            if (IfGap_SELLLevel_00AlreadyExe == false)
            {
                IfGap_SELLLevel_00AlreadyExe = true;
                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) 
        { 
            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);
            if (ret00 == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}


例子2:

这个例子不是我想要的...我试着用这个选项来阻止它在每个tick上修改发送......但是它没有滚动浏览订单,只是在每个tick上修改一个正确的票据(它修改了第一个订单,我猜是索引缓存中的最后一个订单)。

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()
{
    bool IfGap_SELLLevel_00AlreadyExe = FALSE;
    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;
            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()));
        }
    }
    
}


我又做了50次尝试,首先尝试了一个小的IF EXECUTED 00部分,如果之前没有执行,就把它传递给IFGAP......然而我没有什么运气,在hand..... 之前插入一个开关。 我可能就把这个例子贴出来,以显示这个选项....

例3:

有了开关......它的效果仍然和例1一样。 它能正确地滚动订单,但仍然在每一次点击时进行修改......

我可以看到,这个开关一直得到的问题是假的,所以只是再次运行......然而其他的尝试根本不会让它通过......我应该坚持这个选项,并尝试在其他地方声明IfGap_SELLLevel_00AlreadyExe = true,如果是这样,在哪里?

void IfGap_SELLLevel_00AlreadyBlock()
{
    if (OrderSelect(FirstRunSell_ticket_00,SELECT_BY_TICKET,MODE_TRADES))
    {
        IfGap_SELLLevel_00AlreadyExe = false;
    }
    if (IfGap_SELLLevel_00AlreadyExe == false)
    {
        IfGap_SELLLevel_00AlreadyExe = true;
        IfGap_SELLLevel_00();  
    }
}


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) 
        { 
            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 ret = OrderModify(OrderTicket(), OrderOpenPrice(), Level_00_SL, Level_00_TP, 0, Modify_Order_Colour);
            if (ret == false)
            Print("OrderModify() error - ", ErrorDescription(GetLastError()));
        }
    }
    
}


所以是的,在再次打扰你们之前,我真的试过了,....,好几个小时......。 我又迷失了...

任何帮助或指点都会被感激;)