任何菜鸟问题,为了不给论坛添乱。专业人士,不要路过。没有你就无处可去 - 6. - 页 66

 
Roger:

你所说的 "跟踪 "实际上不是,它是以不同的方式计算的,其行为可能是不合逻辑的。


尽管我们对这些术语的概念并不一致,但你确实理解我,不是吗?

解决了这个问题,它就在这里。

double getLots(double newSL) {
   int opnTime = 0; // время открытия трейда для цикла пересчета позиций
   double lotSum = 0; 
   for (int i = 0; i <= OrdersTotal()-1; i++) {
      OrderSelect(i, SELECT_BY_POS);     
      if ((OrderOpenTime() > opnTime) && (OrderType() == OP_BUY) || (OrderType() == OP_SELL)) { 
         opnTime = OrderOpenTime(); 
         if (OrderType() == OP_BUY)    { lotSum += OrderLots() * (newSL - OrderOpenPrice()) / Point; }
         if (OrderType() == OP_SELL)   { lotSum -= OrderLots() * (newSL - OrderOpenPrice()) / Point; }
      }
   }   
   return(lotSum);
}

这个函数没有考虑到所有未完成的交易,所以我不得不改变循环条件。现在看起来是这样的。

double AcountProfitEx(double Price) {
   double   ProfitSum   = 0;
   for (int i = OrdersTotal()-1; i >= 0; i--) {
      OrderSelect(i, SELECT_BY_POS);
      if(OrderType() == OP_BUY)
      ProfitSum -= (OrderOpenPrice() - Price) * OrderLots() / Point;
      if(OrderType() == OP_SELL)
      ProfitSum += (OrderOpenPrice() - Price) * OrderLots() / Point;
   }
   return (ProfitSum);
}

该函数计算所有未平仓交易在其指定的价格水平上的利润总和。然而,有一种引用的观点认为,它没有考虑到价差,我同意这种观点。本意见的作者提出了这个解决方案。

double getLots(double newSL)
{
   double TickValue, delta;
   double lotSum;
   string SymbolName;
   
   SymbolName = Symbol();
   TickValue = MarketInfo( SymbolName, MODE_TICKVALUE) / Point;
   delta = ( newSL - Bid ) * TickValue;

   lotSum = 0.0; 
   for (int i = 0; i <= OrdersTotal()-1; i++)
   {
      OrderSelect(i, SELECT_BY_POS);     
      if ( OrderSymbol() == SymbolName )
      { 
         if (OrderType() == OP_BUY)    { lotSum += OrderProfit() + OrderLots() * delta; }
         if (OrderType() == OP_SELL)   { lotSum += OrderProfit() - OrderLots() * delta; }
      }
   }   
   return(lotSum);
}

但我坦白地说,我不理解他的写作。

差价没有计算在内。这可以通过从当前价格算起的结果进行纠正。
我不明白他建议的算法,如何考虑到价差?谁能解释一下?
 
Mepkypuu:

但是,说实话,我并不理解他的写作。

我似乎不明白他的算法;那里的价差是如何考虑的?谁能解释一下?

OrderProfit()计算的是当前Ask的空头头寸,这是考虑到当前价差的价值。如果价差不发生变化,当价格从当前的买入价变为新SL时,该头寸的单手利润(买入或卖出,有适当的符号)将按delta值变化,该值写在操作符上。

delta = ( newSL - Bid ) * TickValue;

简而言之,OrderProfit()计算一切,包括点差。 我们用OrderProfit()将结果固定在某一时刻(当前价格)。从这里开始,我们所要做的就是监测价格变化。

 
Mislaid:

OrderProfit()计算的是当前Ask的空头头寸,这是考虑到当前点差值的地方。如果价差没有变化,当价格从当前的买入价变为新的SL时,该头寸的单手利润(无论是买入还是卖出,都有相应的符号)将按delta值变化,该值写在报表上。

delta = ( newSL - Bid ) * TickValue;

简而言之,OrderProfit()计算一切,包括点差。 我们用OrderProfit()将结果固定在某一时刻(当前价格)。从这里开始,我们所要做的就是监测价格变化。

我想我开始明白了,但也许它更正确。

if (OrderType() == OP_BUY)    { lotSum += OrderProfit() + OrderLots() * ((newSL - Bid) / Point * MarketInfo( SymbolName, MODE_TICKVALUE)); }
if (OrderType() == OP_SELL)   { lotSum += OrderProfit() - OrderLots() * ((newSL - Ask) / Point * MarketInfo( SymbolName, MODE_TICKVALUE)); }

空头头寸的OrderProfit是根据Ask价格计算的,不是吗?

顺便说一下,MarketInfo( SymbolName, MODE_TICKVALUE) 对欧元兑美元货币 对返回329.02,这就是为什么这个函数对我来说不能正常工作。

 

到目前为止,我决定采用一个技巧,即MarketInfo(SymbolName, MODE_TICKVALUE) 以不同方式计算

double GetTickValue(string CurrentQuote) {
   string AccountCurr = AccountCurrency();
   string BaseCurr = StringSubstr(CurrentQuote,0,3);
   string CurrentCurr = StringSubstr(CurrentQuote,3,3);
   
   if (CurrentCurr == AccountCurr)  
      return (MarketInfo(CurrentQuote, MODE_LOTSIZE) * MarketInfo(CurrentQuote, MODE_TICKSIZE));
   if (BaseCurr == AccountCurr)
      return (MarketInfo(CurrentQuote, MODE_LOTSIZE) * MarketInfo(CurrentQuote, MODE_TICKSIZE) / MarketInfo(CurrentQuote, MODE_BID));
   if ((CurrentCurr != AccountCurr) && (BaseCurr != AccountCurr))  
      return (MarketInfo(CurrentQuote, MODE_LOTSIZE) * MarketInfo(CurrentQuote, MODE_TICKSIZE) * MarketInfo(StringConcatenate(BaseCurr,AccountCurr), MODE_BID) / MarketInfo(CurrentQuote, MODE_BID));
}
 
Mepkypuu:

到目前为止,我决定采用一个技巧,即MarketInfo(SymbolName, MODE_TICKVALUE) 以不同方式计算

它的写法是正确的。在价差不变的情况下,买入价和卖出价分别有多大的变化。
 
Mislaid:
它的写法是正确的。如果价差不变,买入多少,卖出多少,就有多少。

根据个人经验,传播通常是不变的,而且相当强烈)。在急剧的移动中,我看到五位数 的价差从8点增加到80点。
 
有可能对双顶 进行编码(可靠地)吗?
 
001:
双层顶能否被编码(可靠地)?
这是有可能的。
 

在日记中测试专家顾问 时,弹出了一个错误

2013.08.07 12:35:41 2012.06.06 05:29 Puria - 1.452 - SQ EURUSD,M30: Error 4002 (array index - out of range)

2013.08.07 12:35:41 2012.06.06 05:29 Puria - 1.452 - SQ EURUSD,M30: 试图打开一个买入指令。等待答案。

因此,这些订单没有被打开。如何消除这个错误?原因何在?

我很高兴能提供帮助。

 
alexey1979621:

在测试一个EA时,日志中弹出了一个错误

2013.08.07 12:35:41 2012.06.06 05:29 Puria - 1.452 - SQ EURUSD,M30: Error 4002 (array index - out of range)

2013.08.07 12:35:41 2012.06.06 05:29 Puria - 1.452 - SQ EURUSD,M30: 试图打开一个买入指令。等待答案。

因此,这些订单没有被打开。如何消除这个错误?原因何在?

我很高兴能提供帮助。

仅仅从终端信息中看不出什么,如果你不公布EA代码,就没有什么帮助。在你的数组的某个地方,你正在写一批不存在的数据,作为假设之一,但猜测不是我的资料。