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

 
artmedia70:
伊戈尔-金有一个顾问,在设定的时间间隔内进行以下工作


谢谢你!
 

你好。

挂单的问题,特别是到期日的问题。

   ticket=OrderSend(symb, OP_SELLLIMIT, Lots, price, Slippage, 0, 0, lsComm, mn, TimeCurrent() + 60*60, op_color);

这就是新订单的开启方式,即如果它在一小时内没有被触发,服务器应该关闭它。

然后我检查什么是有效日期。

   if (ticket>0)
   {
    OrderSelect(ticket, SELECT_BY_TICKET);
    Alert("OrderExpiration = ", TimeToStr(OrderExpiration(), TIME_DATE),":",TimeToStr(OrderExpiration(), TIME_MINUTES)); 
.......
   } 

这是EA在测试器中工作时我得到的情况。

2013.03.01 12:45:58 2012.01.11 11:00 #advisor# EURUSD,H1: open #1sell limit 2.00 EURUSD at 1.27972 ok
2013.03.01 12:45:58 2012.01.11 11:00 #advisor# EURUSD,H1: Alert:OrderExpiration = 2012.01.11:12:00
2013.03.01 12:45:58 2012.01.12 16:29 测试者:订单#1,卖出2.00 EURUSD在1.27972处开仓

也就是说,到期日期和时间设置正确,如我所愿,但在到期时没有平仓--24小时后开仓。

我搜索了几个论坛,出现了这个问题。通常的答案是 "它对我有用 "或 "自己追踪挂单"。我不想自己跟踪它们,这对我来说是不可行的。

 
artmedia70:
伊戈尔-金有一个顾问,在设定的时间间隔内进行以下工作

它的效果很好。

谢谢你的提示!

 
DhP:

它的效果很好。

谢谢你的提示!


这不是我,是谷歌。

我想你可以自己从那里拉出保存屏幕的功能,并设置自己的参数来调用它--我太懒了......

 
borilunad:
谢尔盖!我暂时不回答关于函数的问题,因为明天我将在你的测试EA中插入一些更多的函数,以进行一个干净的实验。我在视觉模式下观察过,几乎所有的双倍平仓都是最后一次,之前的平仓都是由SL和TP关闭的,也就是说,没有什么可以选择的。为了让大家有所选择,我去掉了 "停 "和 "取"。明天,我将展示你的专家顾问的所有附加功能和评论!你将能够亲自看到这个功能是如何工作的。我真的希望它能表明我是错的!"。如果我是对的,我将努力做到最好!明天见!

谢尔盖。 杜巴金,早上好(对我来说),下午好(对你来说)!做了一个目测,确定这个函数选择的是最大值,这就是我所需要的!。我很高兴我不再有任何疑虑,我向你道歉!"。但在我们的业务中,"最好是测量七次......"向你的测试员展示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,0,0,"",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,0,0,"",EA_Magic);
   if(Ticket!=-1) { TimePrev=TimeNow; PrevType=-1; } }

  Comment("BuyPos: ",NumberOfBuyPositions(),"; SellPos: ",NumberOfSellPositions(),
  "; LotPos: ",GetAmountLotFromOpenPos(),
  "\nMaxLoss: ",DoubleToStr(GetMinProfit(),2),"; MaxProf: ",DoubleToStr(GetMaxProfit(),2),
  "\nLossDiff: ",DoubleToStr(GetMinProfit()+GetMaxProfit(),2));

  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); 
}
//+----------------------------------------------------------------------------+
int NumberOfBuyPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderType()==OP_BUY) {
        if (op<0 || OrderType()==op) {
          kp++;
  } } } }
  return(kp);
}
//+----------------------------------------------------------------------------+
int NumberOfSellPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderType()==OP_SELL) {
        if (op<0 || OrderType()==op) {
          kp++;
  } } } }
  return(kp);
}
//+----------------------------------------------------------------------------+
double GetAmountLotFromOpenPos(string sy="", int op=-1, int mn=-1) {
  double l=0;
  int    i, k=OrdersTotal();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
        if (op<0 || OrderType()==op) {
          l+=OrderLots();
  } } } }
  return(l);
}
//+----------------------------------------------------------------------------+
double GetMinProfit(string sy="", int op=-1, int mn=-1) {
  double p;
  int    i, k=OrdersTotal();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
        if (op<0 || OrderType()==op) {
          if (p>OrderProfit()+OrderCommission()+OrderSwap())
          p=OrderProfit()+OrderCommission()+OrderSwap();
  } } } }
  return(p);
}
//+----------------------------------------------------------------------------+
double GetMaxProfit(string sy="", int op=-1, int mn=-1) {
  double p;
  int    i, k=OrdersTotal();
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
        if (op<0 || OrderType()==op) {
          if (p<OrderProfit()+OrderCommission()+OrderSwap())
          p=OrderProfit()+OrderCommission()+OrderSwap();
  } } } }
  return(p);
}
//+----------------------------------------------------------------------------+
 
borilunad:

谢尔盖。 杜巴金,早上好(对我来说),下午好(对你来说)!做了一个视觉检查,确定这个功能选择最大,这是我需要的!我想这是一个很好的例子。我很高兴我不再有任何疑虑,我向你道歉!"。但在我们的业务中,"最好是测量七次......"我向你的测试人员展示了EA的测试功能,增加了功能和注释,以便更清晰地进行视觉检查!谢谢你!

怎么说呢...基于伊戈尔-金所做的东西...只有你的一个特点...其他的都是一样的...

//+----------------------------------------------------------------------------+
int NumberOfBuyPositions(string sy="", int op=-1, int mn=-1) { // для чего присвоены значения по-умолчанию, если они нигде не используются? Кроме op (и то неверно)
  int i, k=OrdersTotal(), kp=0;
  for (i=0; i<k; i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderType()==OP_BUY) {                               // тут жесткая проверка на тип Buy
        if (op<0 || OrderType()==op) {                         // тут лишняя проверка на значение op, используемое по умолчанию и ещё одна лишняя проверка на ==op
          kp++;
  } } } }
  return(kp);
}
//+----------------------------------------------------------------------------+

我想,是这样的。

//+----------------------------------------------------------------------------+
int NumberOfPositions(string sy, int op, int mn) {
  int i, k=OrdersTotal()-1, kp=0;
  for (i=k; i>=0; i--) {
   if (OrderSelect(i,SELECT_BY_POS)) {           // если ордер выбран
      if (OrderMagicNumber()!=mn)   continue;    // если не наш магик - смотрим следующий ордер
      if (OrderSymbol()!=sy)        continue;    // если не наш символ - смотрим следующий ордер
      if (OrderType()!=op)          continue;    // если не соответствует тип - смотрим следующий
      kp++;                                      // тут искомый ордер - увеличим счётчик
      }
   }
  return(kp);
}
//+----------------------------------------------------------------------------+

并叫她出来。

用于按当前符号计算买入和卖出的数量。

//+----------------------------------------------------------------------------+
   int BuyPos= NumberOfPositions(Symbol(), OP_BUY,  Magic);
   int SellPos=NumberOfPositions(Symbol(), OP_SELL, Magic);
//+----------------------------------------------------------------------------+
 
alsu:
pasha5282:
你能告诉我如何在所有未完成的交易中选择最小的手数吗?

int i, ot = OrdersTotal();
double min=0;
int min_ticket=0;
for(i=0;i<ot;i++)
{
if(!OrderSelect(i,SELECT_BY_POS)) continue;
if(OrderType()!=OP_BUY && OrderType() ! =OP_Sell) continue;
if(i=0||min>OrderLots(){min = OrderLots(); min_ticket=OrderTicket();}
}


我一直在浏览这个主题。你的逻辑很奇怪。我对最后一行代码感兴趣。

if(i==0||min>OrderLots()) {min = OrderLots(); min_ticket=OrderTicket();
i 变量只有在循环开始时才有0 的值。此外,它将在每次迭代中增加一个 值。

然后有一个条件,会导致循环继续。

min>OrderLots()
但是min 被声明为0,它的值在代码的其他地方没有变化。这意味着这个值永远不会是真实的!逻辑在哪里?
 
hoz:


我一直在浏览这个主题。你的逻辑很奇怪。我对最后一行代码感兴趣。

变量i 只有在循环的开始时才有0 的值。此外,它将在每次迭代中增加1 的价值。

然后有一个条件,让循环继续下去。

但是min 被声明为零,它的值在代码的其他地方从未改变。这意味着这个值永远不会是真实的!逻辑在哪里?

int i, ot = OrdersTotal();
double min=0.0;
int min_ticket=0;
for(i=0;i<ot;i++)
{
if(!OrderSelect(i,SELECT_BY_POS)) continue;
if(OrderType()!=OP_BUY && OrderType()!=OP_SELL) continue;
if(min==0.0||min>OrderLots()) {min = OrderLots(); min_ticket=OrderTicket();}
}
如果我们这样做,所有奇怪的事情都应该消失。
 
hoz:


我透过树枝看了看。你的逻辑很奇怪。我对最后一行代码感兴趣。

变量i 只有在循环开始时才有0 值。此外,它将在每次迭代中增加1 的价值。

然后有一个条件,让循环继续下去。

但是min 被声明为零,它的值在代码的其他地方从未改变。这意味着这个值永远不会是真实的!逻辑在哪里?

请注意

if(i==0||min>OrderLots()) {min = OrderLots(); min_ticket=OrderTicket();

如果min>OrderLots(),那么min = OrderLots()。

 
r772ra:

请注意

如果min>OrderLots(),那么,min = OrderLots()。

如果min为零,它永远不可能变得比OrderLots()大。