초보자의 질문 MQL5 MT5 MetaTrader 5 - 페이지 1481

 
MrBrooklin #:

이제 알겠습니다. 감사합니다!!! 오픈 포지션이 하나 이상 있으면 오류 코드 4753이 나타나지 않는 것으로 나타났습니다.

안부, 블라디미르.

다음과 같이 작성하면 나타납니다.

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

다음과 같이 작성하면 표시됩니다.

안녕하세요 Alexey, 한 가지 설명이 있습니다. 루프 대신 PositionSelect() 를 사용해야합니까, 아니면 제가 또 뭔가 잘못 이해 했나요?

안부, 블라디미르.

 
MrBrooklin #:

안녕하세요 Alexey, 한 가지 설명이 있습니다. 루프 대신 PositionSelect() 를 사용해야 하나요, 아니면 제가 또 뭔가 잘못 이해한 건가요?

감사합니다, 블라디미르.

원하는 방식으로 작성할 수 있으며, 가장 중요한 것은 존재하지 않는 문자를 작성하여 오류를 얻는 것입니다 ...

 
Alexey Viktorov #:

원하는 방식으로 작성할 수 있으며, 가장 중요한 것은 존재하지 않는 문자를 작성하여 오류를 얻는 것입니다.....

하지만 슬리퍼는 던지지 마세요!!! 오류 코드를 얻을 수 없습니다. ((((

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

안부, 블라디미르.

 
MrBrooklin #:
오류 = "
루 지정자가 있어야 합니다.
 
Artyom Trishkin #:
거기에 지정자가 있어야 합니다.

고마워요 아르템, 성공했어요!!! 모두 정말 감사합니다!

안부, 블라디미르.

 

요컨대, 여기에 설명 된 문제를 다른 방식으로 해결했습니다:

//+------------------------------------------------------------------+
//| 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은 무엇을 의미하나요?

안녕하세요 Alexey, 변수는 pos_total = PositionsTotal()이지만 글로벌 수준에서 설정되었습니다. 이제 함수 내부로 옮겼는데 이것이 문제인 것으로 밝혀졌습니다. 모든 것이 작동했습니다. 무엇이 문제였을까요? 나는 트릭을 전혀 이해하지 못했습니다!!!

이제 실험을 위해 pos_total을 다시 전역 수준으로 옮겼는데 다시 작동이 멈췄지만 함수 안에 넣으면 정상적으로 작동합니다! 적어도 저에게는 기적입니다!!!! )))

글로벌 레벨의 변수는 함수로 초기화할 수 없다는 것이 밝혀졌나요? 그런가요?

안부, 블라디미르.