[存档!]任何菜鸟问题,为了不使论坛变得混乱。专业人士,不要路过。没有你,哪里都不能去 - 4. - 页 129

 
你能告诉我错误在哪里吗--我找不到它。
,我已经重写了订单修改代码,但错误仍然存在。
我强调,这个错误不是来自日志--日志中没有一个错误。
我在运行测试时发现了 "结果 "中的错误。
例如:
我以 1.4654的价格建立了 买入头寸(订单号1)
然后在结果中显示修改(订单号1)价格1.4654,获利1.4752
然后在结果中显示关闭(订单号1)价格1.4704,获利1.4752
利润=50.00

亏损头寸的例子,虽然我应该只在获利时关闭,因为我没有设定止损。
我在1.4820开了一个买入头寸(订单号271)
,在结果中显示修改(订单号271)价格1.4820,获利1.4918
,在结果中显示关闭(订单号1)价格1.4737,获利1.4918
利润= - 83.46

我在所有地方都设置了100的获利空间。

我没有设置StopLoss。

我不知道如何修复它。

当编译这个EA代码时=0个错误和0个警告。

我使用这个代码来修改订单。

//|  Описание : Модификация ордера. Версия функции для тестов на истории.      |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    pp - цена открытия позиции, установки ордера                            |
//|    sl - ценовой уровень стопа                                              |
//|    tp - ценовой уровень тейка                                              |
//|    ex - дата истечения                                                     |
//+----------------------------------------------------------------------------+
void ModifyOrder(double pp=-1, double sl=0, double tp=0, datetime ex=0){
  int    dg=MarketInfo(OrderSymbol(), MODE_DIGITS), er;
  double op=NormalizeDouble(OrderOpenPrice() , dg);
  double os=NormalizeDouble(OrderStopLoss()  , dg);
  double ot=NormalizeDouble(OrderTakeProfit(), dg);
  color  cl;

  if (pp<=0) pp=OrderOpenPrice();
  if (sl<0 ) sl=OrderStopLoss();
  if (tp<0 ) tp=OrderTakeProfit();
  
  pp=NormalizeDouble(pp, dg);
  sl=NormalizeDouble(sl, dg);
  tp=NormalizeDouble(tp, dg);

  if (pp!=op || sl!=os || tp!=ot) {
    if (MathMod(OrderType(), 2)==0) cl=clModifyBuy;
    if (!OrderModify(OrderTicket(), pp, sl, tp, ex, cl)) {
      er=GetLastError();
      Print("Error(",er,") modifying order: ",Error(error_code));
      Print("Ask=",Ask," Bid=",Bid," sy=",OrderSymbol(),
            " op="+GetNameOP(OrderType())," pp=",pp," sl=",sl," tp=",tp);
    }
  }
}
 
我忘了说,这个EA是通过Excel电子表格工作的--Orders.csv 文件保存在/experts/file中。
 
alex12:
你能告诉我这个错误在哪里吗--我找不到它。
我已经重写了订单修改代码,错误依然存在。
我强调,这个错误不是来自于日志--日志中没有任何一个错误。
我在测试过程中发现了 "结果 "中的错误。
例子。
我在1.4654开了一个买入头寸(订单号1)。
接下来,在结果中,它说买入(订单号1)价格为1.4654,获利为1.4752。
接下来,在结果中,它说关闭(订单号1)价格1.4704和TakeProfit 1.4752。
利润=50.00

一个亏损头寸的例子,因为我没有设置止损,所以我应该只在获利时关闭。
我在1.4820开了一个买入头寸(订单号271)。
接下来,在结果中,它说修改(订单号271)价格1.4820和TakeProfit 1.4918。
接下来,结果中显示收盘价(订单号1)为1.4737,获利为1.4918。
利润=-83.46

我把各处的TakeProfit设置为100。

我没有设置StopLoss。

我不知道如何修复它。

当编译这个EA代码时=0个错误和0个警告。

我使用这个代码来修改订单。

当测试器中的平仓交易写成这里,很可能是订单平仓功能的结果(TP和SL与此无关)。
 

请帮助我找到以下数值

1 过去 X=5的最大日波动率(日最高值减去最低值)

2 过去 X=130平均日波动率

3 如果最大日 波动位于 A=75B=150范围内 这些数值如何写在条件中?

double Dmax= 0.0; 
double DAvg= 0.0;
int a = 0; 
int d =d+1;  
while(a < 5) 
  { 
    Dmax = iHigh(Symbol(),PERIOD_D1,d)-iLow(Symbol(),PERIOD_D1,d); 
    a++; 
  } 
//Comment( "T ("+Dmax+")");

while(a < 130) 
   {  
 
DAvg += (iHigh(Symbol(),PERIOD_D1,d-1)-iLow(Symbol(),PERIOD_D1,d-1))/130; 
    a++; 
}
Comment( "T ("+DAvg+")");
 
sergeev:

1.首先你要找出你在窗口需要多少条https://docs.mql4.com/ru/windows/WindowBarsPerChart。

2.然后你就会得到第一个酒吧的日期https://docs.mql4.com/ru/windows/WindowFirstVisibleBar。

3.知道这个初始条形图和条形图的数量--通过这些条形图并确定其中的高点和低点。

4.利润


变体2

https://docs.mql4.com/ru/windows/WindowPriceMaxтво

https://docs.mql4.com/ru/windows/WindowPriceMinВторой 变体

我倾向于第一种方案,但我不知道如何计算窗口中的条数。 第二种方案更加简洁明了。

但如何 "抓住 "前一栏的最后一个最大值和最小值呢? 提前感谢您!

 
MK07:


但是,如何 "抓住 "前一栏的最后最大值和最小值?

你只需要记住当前条形上达到的最大值和最小值,当一个新的条形 出现并成为前一个条形时,你将从记忆的变量中获取最大值和最小值。

 
sergeev:

你只需要记住当前条形图上达到的最大值和最小值,当一个新条形图出现并成为前一个条形图时,你将从记忆中的变量中获取最大值和最小值。


但怎么做呢?假设我们给变量Z分配了一个最大值,出现了一个新的条形图(可能会被检查),Z立即被分配了一个新的值,而值(Z-1)被 "丢失 "了。 可能,在给Z分配一个新值时应该有一些检查(可能会出现一个新的条形图),我依赖于你的专业性和耐心谢谢你的努力。
 

将zet变量声明为静态变量,或者在全局区域内声明它。

在给它分配一个新的值之前,检查一个新的条形图,并检查它的值和当前值之间的差异,然后给它分配一个新的值。

 
smshev:
当测试器中的平仓交易写成你所列举的那样,很可能是订单平仓功能的结果(TP和SL与此无关)

谢谢,但代码中似乎没有错误。

int CloseOrder(int ticket, double lots)
              {
               int err,i1;
               double price;
               OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES);
               if (lots<MarketInfo(Symbol(),MODE_MINLOT))lots=MarketInfo(Symbol(),MODE_MINLOT);
               while(i1<10)
                   {
                    RefreshRates();
                    if (OrderType()==0)price=Bid;
                    if (OrderType()==1)price=Ask;
                    if (OrderType()>1){OrderDelete(ticket);return(0);}
                    OrderClose(ticket,lots,NormalizeDouble(price,Digits),Slippage,Goldenrod);
                    err = GetLastError();
                    if (err == 0) break;
                    Print(WindowExpertName(),Symbol(),Error(err),"  при закрытии ордера");
                    Sleep(100);
                    i1++;
                   }
               return(0);
              }
 

但在EA中还有一个代码。

int CloseMarket()
   {
    for (int j=0; j<OrdersTotal(); j++)
      {
       OrderSelect(j,SELECT_BY_POS,MODE_TRADES);
       if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic && OrderType()<2)
         {
          CloseOrder(OrderTicket(),OrderLots());
          j--;
         }
      }
   }