[存档]任何菜鸟问题,为了不使论坛变得杂乱无章。专业人士,不要与它擦肩而过。没有你,哪里都不能去 - 5. - 页 190

 

谢尔盖-杜巴金 友好地提供了CloseBy功能,但不幸的是,它不符合我的重要条件,即用最大 利润的相反头寸来关闭一个最大 损失的头寸。


阿凡达
19
Diubakin 25.02.2013 23:26
borilunad:
紫外线。亲!我在哪里可以找到能在手动模式下工作的СloseBy()函数?我想在我的猫头鹰中插入它,以便能够不是手动,而是根据条件自动以最大的负值平仓,或以最大的正值平仓。我在代码库中找不到它。我在代码库中没有找到它,谢谢!

试试这个变体。

bool LockOFF(int posit, int oppos, color arrow_color) {
double Result, PrevLoss, PrevProfit;
    int pos, orders_total, order_type, MaxProfitTicket, MaxLossTicket;
   bool Ans;

 MaxProfitTicket=-1; MaxLossTicket=-1;

 orders_total=OrdersTotal();
 for(pos=orders_total-1; pos>=0; pos--) {
  if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
  if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
  if(OrderType()>1) continue;
  Result=OrderProfit()+OrderSwap()+OrderCommission();
  if(Result<0.0 && (PrevLoss==0.0 || Result<PrevLoss)) {
   PrevLoss=Result; MaxLossTicket=OrderTicket(); order_type=OrderType(); } } // end of for

 if(MaxLossTicket==-1) return(false); // нет убыточной позиции
 if(order_type==OP_BUY) order_type=OP_SELL; else order_type=OP_BUY; 

 orders_total=OrdersTotal();
 for(pos=orders_total-1; pos>=0; pos--) {
  if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
  if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
  if(order_type!=OrderType()) continue;
  Result=OrderProfit()+OrderSwap()+OrderCommission();
  if(Result>0.0 && (PrevProfit==0.0 || Result>PrevProfit)) {
   PrevProfit=Result; MaxProfitTicket=OrderTicket(); } } // end of for

 if(MaxProfitTicket==-1) return(false); // нет противоположной прибыльной позиции

 Ans=OrderCloseBy(MaxLossTicket, MaxProfitTicket);
 if(!Ans) { Print("Ошибка при встречном закрытие"); return(false); }
 
 return(true); }

我已经做了定义maxloss GetMaxLoss()和maxprofit GetMaxProfit()的函数,但我不能让LockOFF()选择我指定的一对,而不是其中任何一对。请告诉我在什么地方放我的最大值,也许我需要更多的函数来确定这些位置的票据或索引,那么对我来说就不是问题了,但在这个LockOFF()中,要把它全部放在哪里?谢谢!

 
borilunad:

谢尔盖-杜巴金 友好地提供了CloseBy功能,但不幸的是,它不符合我的一个重要条件,即用最大 利润的相反头寸关闭一个最大 损失的头寸。

你好,这个函数将一个 最大亏损的头寸 与一个最大盈利的相反头寸关闭。这里有一个供测试者使用的测试EA。

extern int EA_Magic=135; // внешняя переменная

int TimeNow, TimePrev, PrevType; // глобальные переменные

int start()
 {
  double Price,SL,TP;
     int Ticket;

  TimeNow=iTime(NULL,240,0);
  if(TimePrev==TimeNow) return(0);

  if(PrevType!=1) {
   Price=NormalizeDouble(Ask,Digits);    
   SL=NormalizeDouble(Price-300*Point,Digits);    
   TP=NormalizeDouble(Price+300*Point,Digits);
   Ticket=OrderSend(Symbol(),OP_BUY,0.1,Price,3,SL,TP,"",EA_Magic);
   if(Ticket!=-1) { TimePrev=TimeNow; PrevType=1; } }

  else if(PrevType!=-1) {
   Price=NormalizeDouble(Bid,Digits);    
   SL=NormalizeDouble(Price+300*Point,Digits);    
   TP=NormalizeDouble(Price-300*Point,Digits);
   Ticket=OrderSend(Symbol(),OP_SELL,0.1,Price,3,SL,TP,"",EA_Magic);
   if(Ticket!=-1) { TimePrev=TimeNow; PrevType=-1; } }

  if(Hour()==0 && TimePrev==TimeNow) LockOFF(EA_Magic);

  return(0);
 }

bool LockOFF(int EA_Magic) {
 double Result, PrevLoss, PrevProfit;
    int pos, orders_total, order_type, MaxProfitTicket, MaxLossTicket;
   bool Ans;

 MaxProfitTicket=-1; MaxLossTicket=-1;

 orders_total=OrdersTotal();
 for(pos=orders_total-1; pos>=0; pos--) {
  if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
  if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
  if(OrderType()>1) continue;
  Result=OrderProfit()+OrderSwap()+OrderCommission();
  if(Result<0.0 && (PrevLoss==0.0 || Result<PrevLoss)) {
   PrevLoss=Result; MaxLossTicket=OrderTicket(); order_type=OrderType(); } } // end of for

 if(MaxLossTicket==-1) return(false); // нет убыточной позиции
 if(order_type==OP_BUY) order_type=OP_SELL; else order_type=OP_BUY; 

 orders_total=OrdersTotal();
 for(pos=orders_total-1; pos>=0; pos--) {
  if(!OrderSelect(pos, SELECT_BY_POS, MODE_TRADES)) continue;
  if(OrderSymbol()!=Symbol() || OrderMagicNumber()!=EA_Magic) continue; // не наш ордер
  if(order_type!=OrderType()) continue;
  Result=OrderProfit()+OrderSwap()+OrderCommission();
  if(Result>0.0 && (PrevProfit==0.0 || Result>PrevProfit)) {
   PrevProfit=Result; MaxProfitTicket=OrderTicket(); } } // end of for

 if(MaxProfitTicket==-1) return(false); // нет противоположной прибыльной позиции

 Ans=OrderCloseBy(MaxLossTicket, MaxProfitTicket);
 if(!Ans) { Print("Ошибка при встречном закрытие!"); return(false); }
 
 return(true); }

当一个新的4小时条形图出现时,它交替打开买入和卖出头寸,并在新的一天开始时进行一次相反的关闭。

 
Diubakin:

你好,该函数将损失最大的头寸与利润最大的相反头寸关闭。这里有一个供测试者使用的测试EA。

当一个新的4小时条形图出现时,它交替打开买入和卖出头寸,并在新的一天开始时进行一次相反的关闭。

你好,Sergey,我有一个不同的算法!问题是,这个函数关闭了它所拥有的东西,而我需要它关闭最大的,而不是任何的!我需要它关闭最大的。好吧,没什么,如果没有人帮助我,我就自己完成它!"。你的版本只对测试者有好处,所以根据规则加到了标题里。工作正常,没有错误,但不能选择最大限度!"。同样地,感谢您的帮助!
 
alsu:

好了,我现在明白了。如果当前条形上的价格达到Open[0]+30,那么我们就开盘。如果条形图已经结束,Open[0]已经改变,开放水平也相应地被转移。市场上应该只有一种交易,对吗?

然后是这样的。

不需要跟踪新的条形图,因为当它形成时,系统会自动给Open[0]添加一个新的值,这意味着新的水平将被正确计算。请注意,"买入 "交易是以当前的 "卖出 "价格打开的,而它是以 "买入 "价格关闭(TP和SL)。此外,价格值应被规范化。


非常感谢您的帮助。

但在测试器中,每分钟 的蜡烛都会打开交易。这些信息在这个链接中http://clip2net.com/s/2T98Y

我想让它在5分钟 的蜡烛图上打开一个订单,但不是在每个 蜡烛图上都 打开。

但只有当当前的 五分钟蜡烛图>或=30点 (从开盘价到其最大值)。

也就是说,在从零点=当前五分钟蜡烛的开盘价开始的第三十点上开一个市场订单。

而如果当前5分钟内从开盘价到其最高价的时间小于30点,我们就不应该开市价单。

我在Excel中计算了一下,从1999年开始,欧元-美元 双向的订单会有一点,比3000多一点。

我们切换到下一个五分钟周期,如果它,即当前五分钟周期>或= 30点,那么我们在第三十点开盘,如果更少,我们切换到下一个五分钟周期......如此循环,直到图表结束。

但问题 是,据粗略估计,大多数>或=30点 的5分钟计划 远远超过了15点,而不是在30点停止时被关闭。

你有一个条件-- 如果没有未结订单

但在我的系统中,可以连续形成两个具有上述参数的 五分钟时段 如果前一个五分钟时段的订单没有关闭,那么在第二个五分钟时段就不会有订单。

我需要在每5分钟的时间里开一个订单,参数如上所述,无论交易中是否有订单。

 
if (OrdesTotal()==0 && Close[0]>=Price)  
 
alsu:

就这样吧,我现在已经知道了。如果当前条形上的价格达到Open[0]+30,那么我们就开盘。如果条形图已经结束,那么Open[0]已经改变,开盘水平也相应地发生了变化。市场上应该只有一种交易,对吗?

然后是这样的。

不需要跟踪新的条形图,因为当它形成时,系统会自动给Open[0]添加一个新的值,这意味着新的水平将被正确计算。请注意,"买入 "交易是以当前的 "卖出 "价格打开的,而它是以 "买入 "价格关闭(TP和SL)。此外,价格值应被规范化。


而且你还有第二个条件--如果当前5分钟的收盘价>=订单的开盘价。

但在我的想法中,当前5分钟内的收盘价可以是任何价格,只要其高点>或=30点。


Close[0]>=Price

 
borilunad:
你好,Sergei,我有一个不同的算法!这就是问题所在,这个函数关闭了它所拥有的,我希望它关闭最大的,而不是任何!"。好吧,没什么,如果没有人帮助我,我就自己完成它!"。你的版本只对测试者有好处,所以根据规则加到了标题里。工作正常,没有错误,但不能选择最大限度!"。同样地,感谢您的帮助!

你想怎么做?我贴出的那个确定存款货币 中最无利可图的头寸(货币),然后确定也是存款货币中最有利可图的相反头寸,并进行反平仓。

borilunad:

我已经实现了确定maxloss GetMaxLoss()和maxprofit GetMaxProfit()的函数,但我不能让LockOFF()函数选择我指定的一对,而不是其中任何一对。请告诉我在什么地方放我的最大值,也许我需要更多的函数来确定这些位置的票据或索引,那么对我来说就不是问题了,但在这个LockOFF()中,要把它全部放在哪里?谢谢!

该函数拥有一切--定义了最大损失、最大利润,票据也被定义。

 
Diubakin:

你想怎么做?你发布的那个,确定存款货币中最无利可图的头寸(货币),然后确定也是存款货币中最有利可图的相反头寸,并进行反平仓。

该函数拥有一切--定义了最大损失,最大利润,票据也被定义。

你错了!这就是为什么我把所有的数据放在评论中,看到它关闭的不是MaxiLoss maxiProfit,而是我遇到的任何第一个。而我的函数清楚地显示了具有最大损失和利润的头寸指数。只需将这些检查添加到LockOFF()中即可。
 
borilunad:
你错了!你可能有唯一一对相反的位置,而我可能有更多,因为我在评论中显示了所有的数据,看到它关闭的不是maxiLoss maxiProfit,而是搜索中出现的任何第一个。而我的函数清楚地显示了具有最大损失和利润的头寸指数。我只需要在LockOFF()中加入这些检查即可。
你在测试器中看到这个功能的测试EA了吗?无论有多少个订单--两个或二十个,它都能准确地以最大利润关闭最大损失。
 
Vinin:

https://www.mql5.com/ru/code/7835 只有这个是一个指标。你必须在EA中使用对象。
我感兴趣的是专家顾问,对象 - 我应该自己画一个蜡烛吗?
 
Diubakin:
你看了测试器中该功能的测试EA吗?无论有多少个订单--两个或二十个,它都能准确地以最大利润关闭最大损失。
当然,我做到了!的确,我没有超过三个。我到处都找了,在结果中的测试器中,在日记中,在演示中,在图表中也都找了!但我没有找到。当我这样做的时候,我会给你看!