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

 
Kapizdo4ka:

你好!请你告诉我为什么我有时会出现ifle运算符不工作的情况。
下面是一个例子。

其中:
H3是级别的价格值
价格是当前的价格

结果是价格达到这个级别(有时甚至停在这个级别),但警报没有触发。
你能告诉我错误是什么吗?

其错误在于,价格很少与水平值 完全吻合。要么价格>=H3,要么定义一个误差范围。
 
//+------------------------------------------------------------------+
//|                                                        Ozero.mq4 |
//|                                            Copyright 2014, Vinin |
//|                                             http://vinin.ucoz.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Vinin"
#property link      "http://vinin.ucoz.ru"
#property version   "1.00"
#property strict
// -------- переменные --- Н -----
extern double gLot=0.1;            // размер лота для покупки 
extern double gPoint=0.001;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
// -------- переменные --- К ----- 
int init()
  {
   return(0);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {

// Открытие позиции
   if(OrdersTotal()==0)
     {
      Print(" Открытие первой позиции ");
      double _Ask=MarketInfo("GBPUSD",MODE_ASK);
      int ticket=OrderSend("GBPUSD",OP_BUY,gLot,_Ask,15,0,0);
      if(ticket>0)
        {
         Print(" ОРДЕР ОТКРЫТ ",ticket);
        }
     }

   double _Bid=MarketInfo("GBPUSD",MODE_BID); //для цены
   for(int pos=OrdersTotal()-1;pos>=0;pos--)
     {
      if(OrderSelect(pos,SELECT_BY_POS))
        {
         if(OrderOpenPrice()+gPoint<_Bid)
           {
            OrderClose(OrderTicket(),OrderLots(),_Bid,15);
            
ResetLastError();
if(!OrderClose(OrderTicket(),OrderLots(),_Bid,15)) Print("Чё-та не закрылася позиция. Фигня вот такая происходит: "+GetLastError());

           }
        }
     }
   return(0);
  }

上午好。

该程序看起来像这样。

编译时,它给出了。

奥泽罗。mq4'奥泽罗。mq4 1 1
应检查'OrderClose'的返回值 Ozero.mq4 46 13
从 "数字 "到 "字符串 "的隐式转换 Ozero.mq4 49 117
0个错误(s), 2个警告(s)1 3


结果 "选项卡显示,订单正在打开和关闭。

1 2014.08.25 00:00 买1 0.10 1.6550 0.0000 0.0000 0.00 10000.00
2 2014.08.25 06:30 收盘 1 0.10 1。6562 0.0000 0.0000 0.12 10000.12
3 2014.08.25 06:31 买2 0.10 1.6564 0.0000 0.0000 0.00 10000.12
4 2014.08.25 10:00 关闭 2 0.10 1.6574 0.0000 0.0000 0.10 10000.22
5 2014.08.25 10:00 买3 0.10 1.6576 0.0000 0.0000 0.00 10000.22
6 2014.08.25 12:58 收盘 3 0.10 1。6586 0.0000 0.0000 0.10 10000.32
7 2014.08.25 12:58 买4 0.10 1.6590 0.0000 0.0000 0.00 10000.32
8 2014.08.26 13:13 收盘在止损4 0.10 1.6576 0.0000 0.0000 -0.14 10000.18


8 - 我通过关闭测试器打断了工作。


接下来,我们看一下 "日志"。

2014.10.31 07:46:44.837 GBPUSD,M15: 在312876毫秒内处理了4453个tick事件(5608条,340128条状态)(总时间324436毫秒)。
2014.10.31 07:46:44.837 2014.08.26 13:13 测试人员:4号订单已关闭
2014.10.31 07:46:44.798 2014.08.26 13:13视觉测试器 停止了
2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15: ORDER OPEN 4
2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15: open #4 buy 0.10 GBPUSD at 1.6590 ok
2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15: Open #4 buy 0.10 GBPUSD at 1.6590 ok
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: 我认为它没有关闭。在这里,我们去:4108
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: OrderClose error 4108
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: OrderClose函数的未知票3
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: close #3 buy 0.10 GBPUSD at 1.6576 at price 1.6586
2014.10.31 07:42:51.123 2014.08.25 10:00 Ozero GBPUSD,M15: HOLD OPEN #3
2014.10.31 07:42:51.123 2014.08.25 10:00 Ozero GBPUSD,M15: open #3 buy 0.10 GBPUSD at 1.6576 ok
2014.10.31 07:42:51.123 2014.08.25 10:00 Ozero GBPUSD,M15: 打开#1位置
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15:怎么了?在这里,我们去:4108
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: OrderClose error 4108
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: OrderClose函数的未知票2
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: close #2 buy 0.10 GBPUSD at 1.6564 at price 1.6574
2014.10.31 07:42:31.473 2014.08.25 06:31 Ozero GBPUSD,M15: HOLD OPEN 2
2014.10.31 07:42:31.473 2014.08.25 06:31 Ozero GBPUSD,M15: open #2 buy 0.10 GBPUSD at 1.6564 ok
2014.10.31 07:42:31.473 2014.08.25 06:31 Ozero GBPUSD,M15: 开启第一个位置
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15:怎么了?在这里,我们去:4108
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: OrderClose error 4108
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: OrderClose函数的未知票1
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: close #1 buy 0.10 GBPUSD at 1.6550 at price 1.6562
2014.10.31 07:41:31.966 2014.08.25 00:00 Ozero GBPUSD,M15: ORDER OPEN 1
2014.10.31 07:41:31.966 2014.08.25 00:00 Ozero GBPUSD,M15: Open #1 buy 0.10 GBPUSD at 1.6550 ok
2014.10.31 07:41:31.966 2014.08.25 00:00 Ozero GBPUSD,M15: Open #1 buy 0.10 GBPUSD at 1.6550 ok
2014.10.31 07:41:31.958 Ozero输入:gLot=0.1;gPoint=0.001。

现在我完全不知所措了。一方面,正如你在图表和结果中看到的那样,订单正在被平仓,另一方面,代码在执行时出现了错误,正如日志中看到的那样:(((((((((((

奥泽罗。

 
你正试图关闭同一个订单两次。取出最上面的那个。
 
Roger:
你正试图关闭同一个订单两次。取出最上面的那个。
最好是较低的那个。顺序必须事先选定。
 
            
//ResetLastError();
//if(!OrderClose(OrderTicket(),OrderLots(),_Bid,15)) Print("Чё-та не закрылася позиция. Фигня вот такая происходит: "+GetLastError());

上午好。

消除了两条线。一切正常。而且一切都正确地显示在图表上,以及在结果和日志中。

问题:在编译的时候,它给出了


'奥泽罗。mq4'奥泽罗。mq4 1 1
应检查'OrderClose'的返回值 Ozero.mq4 46 13
0个错误(s), 1个警告(s)1 2



编译器对我的警告是什么?第46行是OrderClose(OrderTicket(),OrderLots(),_Bid,15)。


奥泽罗。

 
tuner:

你们能告诉我今天发生的故障可能是什么原因造成的吗?

该EA有一个选项是在周五收市前15分钟停止交易。

当新的一天出现时,EA检查是否是星期五,那么今天我们在StringToTime("23:59")-15*60停止交易。

在策略测试器中,这个功能运行正常。 然而,在实际交易中,我看到了完全不同的情况--当星期五到来时,专家顾问在第一个刻度上停止交易。

以下是专家顾问杂志上的印刷品。

1号经纪人,演示。

0 05:59:47.731 Scalper GBPAUDpt,M1: Finish In Friday = 2014.10.23 23:44:00

经纪人2,真实。

0 03:00:11.999 Scalper EURUSD,M1: Finish In Friday = 2014.10.23 23:44:00

也就是说,当今天的日线出现(10月24日,星期五)的第一个刻度时,EA

将把 "23:59 "一行转换成昨天的时间,而不是指定今天的时间。

但是,如果专家顾问在星期五的中午重新启动,它将正确地确定完成的时间。

我已经找到了这个问题的原因:https://forum.mql4.com/33023

不出所料,这实际上是StringToTime 函数的一个错误。所有的症状都是类似的。此函数将字符串 "23:59 "转换为本地电脑的日期,而不是MT4的日期。而在测试器中,正如我们所知,本地PC的日期被模拟并等同于终端时间。这就是为什么在测试器中一切工作正常,但在演示/实时中却出现故障和损失。当然,文档中并没有说这个日期是怎么来的,上面的链接显示这个问题在4年前就被报告了,但显然,methaquotes并不关心。

 
      RefreshRates();                     // Обновим данные
      _Bid=MarketInfo( "GBPUSD",MODE_BID);

      if (_Bid>=gPoint1)
        {
           for(pos=OrdersTotal();pos>=0;pos--)
             {
                OrderClose(OrderTicket()-1,OrderLots(),_Bid,15);
             }      
       
        }

另一个问题。我的理解是否正确。

1. 订单编号从 "0 "开始。

2.这段代码绝对会关闭所有的订单,无论我是手动还是程序化打开它们?也就是说,我们永远不会发现这部分程序不能关闭的订单?


奥泽罗。

 

有人做过屏幕上的滚动文字吗?例如--某某订单打开/关闭/修改,等等。某某的新闻...?

如果你不介意的话,请给我看一段代码。

谢谢!

 
Vinin:
低一点的比较好。顺序必须事先选择。

这样做更好。

//+------------------------------------------------------------------+
//|                                                        Ozero.mq4 |
//|                                            Copyright 2014, Vinin |
//|                                         http://bomzh_inc.ucoz.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Bomzh Inc"
#property link      "http://bomzh_inc.ucoz.ru"
#property version   "1.00"
#property strict
// -------- переменные --- Н -----
input double gLot=0.1;           // Размер лота для покупки 
input double gPoint=0.001;       // Дельта для закрытия 
input string symbol="GBPUSD";    // Рабочая валютная пара
void OnTick() {
   // Открытие позиции
   if(OrdersTotal()==0) {
      int ticket=0;
      double _Ask=SymbolInfoDouble(symbol,SYMBOL_ASK);
      Print(" Открытие первой позиции ");
      ticket=OrderSend(symbol,OP_BUY,gLot,_Ask,15,0,0);
      if(ticket>0) Print("ОТКРЫТ ОРДЕР #"+IntegerToString(ticket));
      }
   //--- Закрытие позиций
   double _Bid=SymbolInfoDouble(symbol,SYMBOL_BID); //для цены
   for(int pos=OrdersTotal()-1;pos>=0;pos--) {
      if(OrderSelect(pos,SELECT_BY_POS)) {
         if(OrderSymbol()!=symbol) continue;
         if(OrderType()!=OP_BUY)   continue;
         if(OrderOpenPrice()+gPoint<_Bid) {
            ResetLastError();
            if(!OrderClose(OrderTicket(),OrderLots(),_Bid,15)) 
               Print("Чё-та не закрылася позиция. Фигня вот такая происходит: "+IntegerToString(GetLastError()));
            }
         }
      }
   //--- End OnTick()
}
//+------------------------------------------------------------------+
 
_new-rena:

有人做过屏幕上的滚动文字吗?例如--某某订单打开/关闭/修改,等等。某某的新闻...?

如果你不介意的话,请给我看一段代码。

森克斯!

在空的指标窗口中 做垂直滚动。这里有一个功能。

//+------------------------------------------------------------------+
// Если bool print = true или нет окна индикатора, то функция будет выводить сообщения в журнал
void iPrint(string mess1, int sz=9, color color1=clrDarkGray, 
            string mess2="", color color2=clrDarkGray, 
            string mess3="", color color3=clrDarkGray, 
            string mess4="", color color4=clrDarkGray, 
            bool draws=true) {
   string   NameGrafText, message, nm;
   int      i, y, k, shift, Win_Num=-1, num=0;
   color    cl;
   Win_Num=WindowFind("Win_Inform");
   if (mess1=="") {
      //Print("Func iPrint: Передана пустая строка, выходим");
      return;
      }
   if (!draws || Win_Num<0) {
      message=mess1+mess2+mess3+mess4;
      Print(message); 
      return;
      }
   k=ArraySize(Mass_Name_Message)-1;
   if (StringLen(mess1)>0) num++;
   if (StringLen(mess2)>0) num++;
   if (StringLen(mess3)>0) num++;
   if (StringLen(mess4)>0) num++;
// Смещение и перекрашивание старых сообщений   
   for (i=k; i>=0; i--) {                             
      NameGrafText=Mass_Name_Message[i];           
      if (StringLen(NameGrafText)>0) {
         if (ObjectFind(NameGrafText)==Win_Num) {
            if (i+num>k) {                   // Удаляем самую верхнюю строчку
               ObjectDelete(NameGrafText);  
               Mass_Name_Message[i]="";
               }
            else if (i+num<=k) {             // Сдвигаем и перекрашиваем старые сообщения
               Mass_Name_Message[i+num]=Mass_Name_Message[i];
               y=(int)ObjectGet(NameGrafText, OBJPROP_YDISTANCE);          // старая координата Y
               ObjectSet  (NameGrafText, OBJPROP_YDISTANCE, y+(sz+1)*num); // новая координата Y
               ObjectSet  (NameGrafText, OBJPROP_COLOR, clrDimGray);       // новый цвет
               }
            }
         }
      }
// Вывод новых сообщений
   shift=num;
   uint v=GetTickCount();
   for (i=0; i<num; i++) {
      shift--;
      NameGrafText=Prefix+"_GT_"+IntegerToString(i)+"_"+IntegerToString(v);   // Уникальное имя объекта
      int app=0;
      while (ObjectFind(NameGrafText)==Win_Num) {  // Если всё-таки такой объект есть
         app++;
         NameGrafText=Prefix+"_GT_"+IntegerToString(i)+"_"+IntegerToString(v)+"_"+IntegerToString(app); // добавим к его имени "хвостик"
         }
      Mass_Name_Message[num-1-i]=NameGrafText;
      switch (i) {
         case 0: message=mess1; cl=color1; break;
         case 1: message=mess2; cl=color2; break;
         case 2: message=mess3; cl=color3; break;
         case 3: message=mess4; cl=color4; break;
         default:message=mess1; cl=color1; break;
         }
      ObjectCreate (NameGrafText, OBJ_LABEL, Win_Num, 0, 0);
      ObjectSetText(NameGrafText, message, sz, "Courier New", cl);
      ObjectSet    (NameGrafText, OBJPROP_COLOR, cl);                   // цвет
      ObjectSet    (NameGrafText, OBJPROP_CORNER,    2);                // угол
      ObjectSet    (NameGrafText, OBJPROP_XDISTANCE, 150);              // координата Х
      ObjectSet    (NameGrafText, OBJPROP_YDISTANCE, 2+(sz+1)*shift);   // координата Y
      WindowRedraw();
      }
}
//+------------------------------------------------------------------+

作为一个使用单色信息的例子(你可以在一行中用4种颜色表示不同的字)。

if(get.BarOpenLastPos(sy,PERIOD_H4,OP_SELL,mn)!=0) {
   string mess1="На D1 вниз, на H4 ниже SAR, M15 сигнал. Продаём";
   iPrint(mess1,9,clrBlue);
   trade.OpenS(sy,lots,mn,0.0,0.0,co);
   }

图表上应该有一个名为Win_Inform的空指标。