初学者的问题 MQL5 MT5 MetaTrader 5 - 页 1481

 
MrBrooklin #:

现在有了。谢谢原来,如果至少有一个打开的位置,错误代码 4753 就不会出现。

敬礼,弗拉基米尔

如果您写下以下内容,错误代码就会出现

PositionSelect("мой символ");
 
Alexey Viktorov #:

如果您这样写,它就会出现

你好,阿列克谢,有一点需要澄清。是否有必要使用PositionSelect() 而不是循环,还是我又误解了什么?

敬上,弗拉基米尔

 
MrBrooklin #:

你好,阿列克谢,我想问一下。是否有必要使用PositionSelect() 而不是循环,还是我又误解了什么?

敬上,弗拉基米尔

你想怎么写都行,最重要的是写入一个不存在的字符,否则就会出错...

 
Alexey Viktorov #:

您可以随意编写,主要是编写一个不存在的字符,以获得错误信息....。

但不要向我扔拖鞋!!!我无法获取错误代码!我得不到错误代码。((((

void OnStart()
  {
   ResetLastError(); // установим значение предопределенной переменной _LastError в ноль
   string symb = "BrooklinUSDrfd";
   PositionSelect(symb);
   PrintFormat("Не удалось выбрать позицию по символу %s. Ошибка = ", symb, GetLastError());
  }

弗拉基米尔

 
MrBrooklin #:
错误 = "
应该有 %lu 指定符
 
Artyom Trishkin #:
那里应该有一个指定器

谢谢你,Artem,成功了!..!非常感谢大家!

弗拉基米尔

 

总之,用不同的方式解决了这里 描述的问题:

//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   ResetLastError(); // установим значение предопределенной переменной _LastError в ноль
   if(!PositionSelect(_Symbol))
      PrintFormat("Не удалось выбрать позицию по символу %s. Ошибка = %lu", _Symbol, GetLastError());
   int pos_total = PositionsTotal(); // объявим переменную для хранения количества открытых позиций
   if(pos_total > 0) // если есть открытые позиции
     {
      for(int i=0; i<pos_total; i++) // запустим цикл и переберём все открытые позиции
        {
         if(PositionGetSymbol(i) == _Symbol) // выберем все открытые позиции по текущему символу
           {
            ulong  pos_id = PositionGetInteger(POSITION_IDENTIFIER);
            double pos_price = PositionGetDouble(POSITION_PRICE_OPEN);
            double pos_tp = PositionGetDouble(POSITION_TP);
            double pos_sl = PositionGetDouble(POSITION_SL);
            PrintFormat("Позиция #%d цена = %G тейк-профит = %G стоп-лосс = %G", pos_id, pos_price, pos_tp, pos_sl);
           }
        }
     }
  }
//+------------------------------------------------------------------+

弗拉基米尔

 

大家晚上好!

我正在尝试创建一个函数,用于在现有未结 头寸的基础上打开一个额外的头寸(不带止损和止盈)。我已经编写了代码:

//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void Open_Add_Pos_Buyl()
  {
   for(int i=pos_total-1; i<pos_total; i++) // ищем последнюю по списку открытую позицию
     {
      PositionGetTicket(i); // получим тикет позиции по индексу в списке открытых позиций
      if(PositionGetString(POSITION_SYMBOL) == _Symbol && // если совпадает символ открытой позиции
         PositionGetInteger(POSITION_TYPE) == POSITION_TYPE_BUY && // если совпадает тип открытой позиции
         PositionGetInteger(POSITION_MAGIC) == Magic_Number) // и если совпадет мэджик
        {
         double pos_price_open=PositionGetDouble(POSITION_PRICE_OPEN); // объявим и инициализируем переменную для цены открытой позиции
         if(// тут задано условие для открытия позиции)
           {
            double new_price_pos=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
            trade.Sell(0.01,_Symbol,new_price_pos,0,0);
           }
        } 
     }
  }

但由于某种原因,它看不到未结头寸。我试图用调试器找出问题所在,但在启动循环后,调试器会立即退出函数,而看不到里面写了什么。我在PositionGetTicket(i)处设置了断点,能否请您再告诉我,我的代码哪里出了问题?

敬上,弗拉基米尔。

 
MrBrooklin 未结 头寸的基础上打开一个额外的头寸(不带止损和止盈)。我已经编写了代码:

但由于某种原因,它看不到未结头寸。我试图用调试器找出问题所在,但在启动循环后,它立即退出函数,而看不到里面写的内容。我在 PositionGetTicket(i) 上设置了断点,能否请您告诉我,我的代码哪里又出错了?

敬上,弗拉基米尔。

什么是 pos_total?

 
Alexey Viktorov #:

pos_total 等于多少?

你好,变量 pos_total=PositionsTotal() 是在全局级别设置的。现在我把它移到了函数内部,结果发现问题就出在这里。一切正常。问题出在哪里?我完全不明白其中的诀窍!!!

现在,为了做实验,我又把 pos_total 移到了全局层,结果它又不工作了,但当我把它放到函数内部时,它又正常工作了!这就是奇迹,至少对我来说是这样!!!!)))

原来全局变量不能被函数初始化?是这样吗?

敬上,弗拉基米尔

原因: