MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 762

 
Artyom Trishkin :

내가 알기로는 수동으로 열린 위치의 티켓을 추적해야 하는 고문에게 어떻게든 표시해야 합니다.

  1. 새로 열린 위치에 대한 추적을 어드바이저에 추가하고 마법이 없으면 수동으로 열립니다. 동시에 EA는 이 포지션을 오픈하기 위한 아이콘을 가격과 오프닝 바에 설정해야 합니다. 개체 이름에는 이러한 모든 개체에 대한 개체의 공통 이름 접두어가 포함되어야 하며(예: "manual_") 위치 티켓이 있어야 합니다. 결과적으로 생성된 개체의 이름은 "manual_12345678"이 될 수 있습니다. 여기: manual_ - 접두사, 12345678 - 위치 티켓.
  2. Expert Advisor에 OnChartEvent()를 추가하고 개체에 대한 마우스 클릭 이벤트를 추적합니다. 개체의 이름을 분석하고 manual_ 하위 문자열이 있으면 manual_ 뒤의 숫자가 무엇인지 확인합니다. 이 번호는 클릭한 포지션의 티켓입니다.
  3. 또한, 기술의 문제입니다. Expert Advisor/터미널/컴퓨터/월드가 다시 시작될 때 손실되지 않도록 찾은 번호를 저장해야 합니다. 예를 들어, 터미널의 리소스 또는 전역 변수에 .
  4. EA는 이 리소스를 읽고 트롤해야 하는 위치의 티켓을 가져와야 합니다.
  5. 트롤 루프에서 선택한 위치의 티켓을 가져 와서 저장된 티켓 목록에서 이 번호를 찾으십시오. 그러한 티켓이 발견되면 이 티켓이 있는 위치를 추적해야 합니다.
  6. 포지션 수 변경 시 마감된 포지션 티켓을 확인하고 저장된 리스트에서 찾아야 합니다. 이러한 티켓이 목록에 있는 경우 이 목록에서 제거해야 합니다. 해당 위치는 더 이상 존재하지 않으며 해당 티켓은 후행 티켓 목록에서 아무 관련이 없습니다.
이 같은. 나는 무릎에 논리를 썼으므로 무엇을 고려할 수 없었습니다 ...


설명해주셔서 감사합니다. 이제 말씀하신 내용을 이해했습니다.

지금까지 어드바이저를 사용하기 위한 슬리피지에 대해 잘 알지 못합니다. mql 수업에서는 3을 설정하는 것이 좋습니다(EURUSD 정도). 하지만 통화의 유동성은 다르고 이동 속도는 동일합니다. 달러 쌍과 십자가에 대한 차분한 시장에서 어떤 숫자로 안내할 수 있습니까?

 
CopyOpen , CopyHigh, CopyLow 및 CopyClose 함수를 사용하여 다차원 버퍼를 채울 수 있습니까? 그렇지 않으면 할 수 없습니다. 설명에 따르면 동적 배열로 복사되며 동적 배열은 다차원 MQL5가 될 수 있습니다.
 
Alexandr Sokolov :
CopyOpen , CopyHigh, CopyLow 및 CopyClose 함수를 사용하여 다차원 버퍼를 채울 수 있습니까? 그렇지 않으면 할 수 없습니다. 설명에 따르면 동적 배열로 복사되며 동적 배열은 다차원 MQL5가 될 수 있습니다.

1차원 배열을 사용...

 
Alexandr Sokolov :
CopyOpen , CopyHigh, CopyLow 및 CopyClose 함수를 사용하여 다차원 버퍼를 채울 수 있습니까? 그렇지 않으면 할 수 없습니다. 설명에 따르면 동적 배열로 복사되며 동적 배열은 다차원 MQL5가 될 수 있습니다.

구조를 이해하는 데 어려움이 있는 경우 ArrayCopyRates 를 사용할 수 있습니다.

 int    ArrayCopyRates ( 
   void &     dest_array[][],     // массив, переданный по ссылке 
   string     symbol= NULL ,       // инструмент 
   int        timeframe= 0          // таймфрейм 
   );

모든 것이 이해와 함께 괜찮다면 더 좋습니다.

CopyRates - Доступ к таймсериям и индикаторам - Справочник MQL4
CopyRates - Доступ к таймсериям и индикаторам - Справочник MQL4
  • docs.mql4.com
Получает в массив rates_array исторические данные структуры MqlRates указанного символа-периода в указанном количестве. Отсчет элементов от стартовой позиции ведется от настоящего к прошлому, то есть стартовая позиция, равная 0, означает текущий бар. При копировании заранее неизвестного количества данных рекомендуется в качестве приемного...
 

안녕하세요. 나는 여러 전문가 고문을 모으려고 노력했고 모든 것이 전략 테스터 에서 해야 하는 대로 작동합니다(시각화 모드에서 확인했습니다). 데모 계정을 등록했는데 주기적으로 다음과 같은 문제가 발생하고 주문이 열리고 즉시 삭제되는 등 시간이 바뀔 때까지 한 시간 동안 계속됩니다. 주문을 입력하고 삭제하는 조건이 동시에 발생한다고 생각했는데 여기에서 삭제는 시간순일 뿐이고, 이 전체 블록을 삭제해도 오류가 사라지지 않았습니다. 누구에게나 어렵지 않다면 어디가 오류인지 알려주세요.

 int start()
{
   // модификация до безубытка
   if ( MathAbs (( OrderOpenPrice ()- Ask )/ Point ) > BUP && CountBuy() > 0 )
      ModifyLoss();

   if ( MathAbs (( OrderOpenPrice ()- Bid )/ Point ) > BUP && CountSell() > 0 )
      ModifyLoss();
      
      
   CurrHour = TimeHour ( TimeCurrent ());
   
   if (CloseByTime == true && DayOfWeek () == DayEnd && CurrHour >= CloseHour)
   {
       if (CountTrades() > 0 || CountStop() > 0 ) CloseTrades();
   
     
   }
     

   if (DayStart == DayOfWeek () && CurrHour == StartHour && ((!SetLimits && CountStop() == 0 ) || (SetLimits && CountLimits() == 0 )) && CountTrades() == 0 )
   {
      high = iHigh ( Symbol (), 0 , 1 );
      low  = iLow ( Symbol (), 0 , 1 );
      spread = MarketInfo ( Symbol (), MODE_SPREAD );
      
       if ((high - low)/ Point <= MaxPips && spread < Maxspread)
      {
         buy  = NormalizeDouble (high + Indent* Point , Digits );
         sell = NormalizeDouble (low - Indent* Point , Digits );
        
      
         if (FixedLot > 0 )
            Lots = FixedLot;
         else Lots = GetLots();

         if (UseMartingale == true )
         {
             if ( AccountBalance () < abalance) 
               Lots = getlotlast();
             else abalance = AccountBalance ();
         }
         
         if (!SetLimits)
         {
            tp_sell = ND(sell-spread* Point - TPP* Point );
            tp_buy  = ND(buy + spread* Point + TPP* Point );
         
            sl_sell = ND(sell + SLP* Point +spread* Point );
            sl_buy  = ND(buy-SLP* Point -spread* Point );
            
           if ( iClose ( NULL , 1440 , 1 ) < iMA ( NULL , 1440 ,PeriodMA, 0 , MODE_EMA , PRICE_CLOSE , 1 )) 
                  OrderSendReliable( Symbol (), OP_SELLSTOP , Lots, (sell-spread* Point ), Slippage, sl_sell,  tp_sell, comment, Magic, 0 , Red);
                                                                         
                                                                         else
                  OrderSendReliable( Symbol (), OP_BUYSTOP ,  Lots, (buy+spread* Point ),  Slippage, sl_buy, tp_buy,  comment, Magic, 0 , Blue);
                                                                       
         
            
         } else
         {
            tp_sell = ND(sell - MathAbs (buy-sell)*TakeProfitK);
            tp_buy  = ND(buy +   MathAbs (buy-sell)*TakeProfitK);
         
            sl_sell = ND(buy + MathAbs (buy-sell)*StopLossK);
            sl_buy  = ND(sell - MathAbs (buy-sell)*StopLossK);
         
            OrderSendReliable( Symbol (), OP_SELLLIMIT , Lots, buy,  Slippage, sl_sell, tp_sell,  comment, Magic, 0 , Red);
            OrderSendReliable( Symbol (), OP_BUYLIMIT ,  Lots, sell, Slippage, sl_buy,  tp_buy, comment, Magic, 0 , Blue);
         }
      }
   }
   return ( 0 );
}
 
craft11111 :

안녕하세요. 나는 여러 전문가 고문을 모으려고 노력했고 모든 것이 전략 테스터 에서 해야 하는 대로 작동합니다(시각화 모드에서 확인했습니다). 데모 계정을 등록했는데 주기적으로 다음과 같은 문제가 발생하고 주문이 열리고 즉시 삭제되는 등 시간이 바뀔 때까지 한 시간 동안 계속됩니다. 주문을 입력하고 삭제하는 조건이 동시에 발생한다고 생각했는데 여기에서 삭제는 시간순일 뿐이고, 이 전체 블록을 삭제해도 오류가 사라지지 않았습니다. 누구에게나 어렵지 않다면 오류가 어디에 있는지 알려주십시오.

OrderSelect 를 통해 루프에서 반복을 수행해야 합니다.

 int start()
{
   // модификация до безубытка
   if ( MathAbs (( OrderOpenPrice ()- Ask )/ Point ) > BUP && CountBuy() > 0 )
      ModifyLoss();

   if ( MathAbs (( OrderOpenPrice ()- Bid )/ Point ) > BUP && CountSell() > 0 )
      ModifyLoss();
      
OrderOpenPrice - Торговые функции - Справочник MQL4
OrderOpenPrice - Торговые функции - Справочник MQL4
  • docs.mql4.com
OrderOpenPrice - Торговые функции - Справочник MQL4
 

내가 아는 한, 조건이 발생하면 선택 순서가 사용되는 수정 기능으로 전환됩니다. 예, 그리고 나는 또한 이 부분을 완전히 제거하려고 시도했지만 모두 동일하게 오류가 남아 있으며 일부 조건이 발생하는지 항상 명확하지 않습니다. 다시 말하지만 테스터에서 모든 것이 잘 작동한다는 것은 당혹 스럽습니다.

 void ModifyLoss()
{
   for ( int trade = OrdersTotal () - 1 ; trade >= 0 ; trade--) 
   {
       OrderSelect (trade, SELECT_BY_POS , MODE_TRADES );
       if ( OrderSymbol () != Symbol () || OrderMagicNumber () != Magic) continue ;
       if ( OrderType () == OP_BUY )
      {
         SL = ND( OrderOpenPrice ());
         if ( OrderStopLoss () < SL && ( Ask - OrderOpenPrice ())/ Point >= BUP)
         {
             if (SL != ND( OrderStopLoss ()))
               OrderModify ( OrderTicket (), OrderOpenPrice (), SL, OrderTakeProfit (), 0 );
         }
      } else
       if ( OrderType () == OP_SELL )
      {
         SL = ND( OrderOpenPrice ());
         if ( OrderStopLoss () > SL && ( OrderOpenPrice ()- Bid )/ Point >= BUP)
         {
             if (SL != ND( OrderStopLoss ()))
                 OrderModify ( OrderTicket (), OrderOpenPrice (), SL, OrderTakeProfit (), 0 );
         }
      }
   }
}
 
craft11111 :

안녕하세요. 나는 여러 전문가 고문을 모으려고 노력했고 모든 것이 전략 테스터 에서 해야 하는 대로 작동합니다(시각화 모드에서 확인했습니다). 데모 계정을 등록했는데 주기적으로 다음과 같은 문제가 발생하고 주문이 열리고 즉시 삭제되는 등 시간이 바뀔 때까지 한 시간 동안 계속됩니다. 주문을 입력하고 삭제하는 조건이 동시에 발생한다고 생각했는데 여기에서 삭제는 시간순일 뿐이고, 이 전체 블록을 삭제해도 오류가 사라지지 않았습니다. 누구에게나 어렵지 않다면 어디가 오류인지 알려주세요.

무역 Print(__FUNCTION__) 또는 블록 Print(예: 그런 블록, 그런 매개변수)를 제어하는 기능을 지정하십시오. 함수/블록이 실행되는 순서를 확인하십시오. 효과가 있었지만 해서는 안 되는 첫 번째 작업은 그때 그녀의 질문이었습니다. "동시 작동에 대해 호환되지 않는 조건을 여기에서 설명했습니다"라는 사실에 의존하는 것은 가치가 없습니다. 블록이 작동하지 않아야 했지만 외부 매개변수로 인해 블록이 켜질 수 있었고 블록 내부의 무언가가 작동하지 않았을 수도 있습니다.

 

OnChartEvent() 는 테스터에서 작동하지 않습니다.

테스터에서 작동할 수 있는 버튼을 보여주세요. 예를 들어, 거래 = true가 발생할 플래그를 클릭하십시오. 다시 눌러? 거래=거짓;

 
Ghabo :

OnChartEvent()는 테스터에서 작동하지 않습니다.

테스터에서 작동할 수 있는 버튼을 보여주세요. 예를 들어, 거래 = true가 발생할 플래그를 클릭하십시오. 다시 눌러? 거래=거짓;

OnTick()에서 버튼 클릭을 제어합니다. 테스터에서 작동하는 경우 조건부로 수행할 수 있습니다. OnTick()의 제어, 그러나 실제로는 이 제어의 블록이 실행되지 않고 OnChartEvent() 에 제어가 있습니다.