포럼을 어지럽히 지 않도록 모든 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 6. - 페이지 168

 

내가 뭘 잘못하고 있는지 말해주세요. 간단한 지표를 만들려고 합니다.


  {

   int limit,i;
   double last;
   int counted_bars = IndicatorCounted();
   //---- check for possible errors
   if (counted_bars < 0 ) 
       return (- 1 );
   //---- last counted bar will be recounted
   if (counted_bars > 0 ) 
       counted_bars--;
   limit = Bars - counted_bars;
//----
   for (i=limit; i>= 0 ; i--)
   {
       double OptClose = Close[i]* 10000 ;
       if ( MathMod (OptClose,step1)== 0 )
      {
      Buffer0[i] = Close[i];
      last = Close[i];
      }
       else
      Buffer0[i] = last;
   }

//----
   return ( 0 );
  }
//+------------------------------------------------------------------+

차트 창에서 작동하며 어드바이저에서 테스트하려고 하면 아무 것도 그리거나 "단계 없음"이 표시됩니다.

 
Virtuon :

내가 뭘 잘못하고 있는지 말해주세요. 간단한 지표를 만들려고 합니다.

차트 창에서 작동하며 어드바이저에서 테스트하려고 하면 아무 것도 그리거나 "단계 없음"이 표시됩니다.

       if ( MathMod (OptClose,step1)== 0 )
         Buffer0[i] = Close[i];
       else
         Buffer0[i] = Buffer0[i+ 1 ];
 
PapaYozh :

시험을 마친. 이 버전에서는 창에서만 작동하지 않습니다. 분명히 여기에 약간의 트릭이 있습니다. 이제 이 버전에서 작동하지만 엄청나게 느립니다.
 for (i=WindowBarsPerChart(); i>= 0 ; i--)
   {
       double OptClose = Close[i]* 10000 ;
       if ( MathMod (i+step1,step1)== 0 )
      {
      Buffer0[i] = Close[i];
      last = Close[i];
      }
       else
      Buffer0[i] = last;
       Comment (Buffer0[WindowBarsPerChart()], " " ,Buffer0[ 0 ]);
   }
이것은 마지막 막대의 재계산 확인이 비활성화된 상태입니다.
 

안녕하세요, MQL4 프로그래밍 전문가입니다! 이것이 어떻게 가능한지 알려주세요:

프로그램 코드 스니펫:

   LogAdd( "Начинаю вычисления переменных для текущего тика ... " );  
   for ( int i = OrdersTotal ()- 1 ; i >= 0 ; i--) {
       OrderSelect (i, SELECT_BY_POS);           
      LogAdd( "Выбираю ордер с тикетом: " + i); 
       if ((OrderOpenTime() > opnTime) && (OrderType() == OP_BUY) || (OrderType() == OP_SELL)) {    
         opnTime = OrderOpenTime();
         currentTicket = OrderTicket(); 
         currentStopLoss = OrderStopLoss();          
         LogAdd( "Ордер открыт позже предыдущего, не является отложенным. Записываю переменные: opnTime - " + opnTime + ", currentTicket - " + currentTicket + ", currentStopLoss - " + currentStopLoss + "." );
      }
       if (OrderType() == OP_BUY) {         
         buyCntr ++;   
         buyOpnPrice = OrderOpenPrice();
         lotsSumBuy += OrderLots();
         TrailingByShadows(OrderTicket(), Period (), 11 , 0 ); 
         LogAdd( "Ордер не является отложенным, тип ордера - на покупку, обновляю переменные, пытаюсь трейлить: buyCntr - " + buyCntr + ", buyOpnPrice - " + buyOpnPrice + ", lotsSumBuy - " + lotsSumBuy + "." );  
      }  
       if (OrderType() == OP_SELL) {
         sellCntr ++;
         sellOpnPrice = OrderOpenPrice();
         lotsSumSell += OrderLots();
         TrailingByShadows(OrderTicket(), Period (), 11 , 0 );
         LogAdd( "Ордер не является отложенным, тип ордера - на продажу, обновляю переменные, пытаюсь трейлить: sellCntr - " + sellCntr + ", sellOpnPrice - " + sellOpnPrice + ", lotsSumSell - " + lotsSumSell + "." );
      }   
       if (OrderType() == OP_SELLSTOP) {
         sellOpnPrice = OrderOpenPrice();         
         LogAdd( "Ордер является отложенным, тип ордера - на продажу, фиксирую цену открытия: sellOpnPrice - " + sellOpnPrice + "." );
      }  
       if (OrderType() == OP_BUYSTOP) {
         buyOpnPrice = OrderOpenPrice();
         LogAdd( "Ордер является отложенным, тип ордера - на покупку, фиксирую цену открытия: buyOpnPrice - " + buyOpnPrice + "." );
      }  
   }
   LogAdd( "Вычисления переменных для текущего тика завершены." ); 

이 섹션의 로그:

 2013.10 . 2 15 : 59 : 0 - Начинаю вычисления переменных для текущего тика ... 
2013.10 . 2 15 : 59 : 0 - Выбираю ордер с тикетом: 5
2013.10 . 2 15 : 59 : 0 - Ордер является отложенным, тип ордера - на продажу, фиксирую цену открытия: sellOpnPrice - 1.35250000 .
2013.10 . 2 15 : 59 : 0 - Выбираю ордер с тикетом: 4
2013.10 . 2 15 : 59 : 0 - Ордер открыт позже предыдущего, не является отложенным. Записываю переменные: opnTime - 1380728738 , currentTicket - 93537240 , currentStopLoss - 0.00000000 .
2013.10 . 2 15 : 59 : 0 - Ордер не является отложенным, тип ордера - на покупку, обновляю переменные, пытаюсь трейлить: buyCntr - 1 , buyOpnPrice - 1.35620000 , lotsSumBuy - 0.06000000 .
2013.10 . 2 15 : 59 : 0 - Ордер не является отложенным, тип ордера - на продажу, обновляю переменные, пытаюсь трейлить: sellCntr - 1 , sellOpnPrice - 1.35250000 , lotsSumSell - 0.01000000 .
2013.10 . 2 15 : 59 : 0 - Выбираю ордер с тикетом: 3
2013.10 . 2 15 : 59 : 0 - Ордер не является отложенным, тип ордера - на продажу, обновляю переменные, пытаюсь трейлить: sellCntr - 2 , sellOpnPrice - 1.35250000 , lotsSumSell - 0.04000000 .
2013.10 . 2 15 : 59 : 0 - Выбираю ордер с тикетом: 2
2013.10 . 2 15 : 59 : 0 - Ордер не является отложенным, тип ордера - на покупку, обновляю переменные, пытаюсь трейлить: buyCntr - 2 , buyOpnPrice - 1.35620000 , lotsSumBuy - 0.07000000 .
2013.10 . 2 15 : 59 : 0 - Ордер не является отложенным, тип ордера - на продажу, обновляю переменные, пытаюсь трейлить: sellCntr - 3 , sellOpnPrice - 1.35250000 , lotsSumSell - 0.05000000 .
2013.10 . 2 15 : 59 : 0 - Выбираю ордер с тикетом: 1
2013.10 . 2 15 : 59 : 0 - Ордер не является отложенным, тип ордера - на покупку, обновляю переменные, пытаюсь трейлить: buyCntr - 3 , buyOpnPrice - 1.35620000 , lotsSumBuy - 0.08000000 .
2013.10 . 2 15 : 59 : 0 - Ордер не является отложенным, тип ордера - на продажу, обновляю переменные, пытаюсь трейлить: sellCntr - 4 , sellOpnPrice - 1.35250000 , lotsSumSell - 0.06000000 .
2013.10 . 2 15 : 59 : 0 - Выбираю ордер с тикетом: 0
2013.10 . 2 15 : 59 : 0 - Ордер не является отложенным, тип ордера - на продажу, обновляю переменные, пытаюсь трейлить: sellCntr - 5 , sellOpnPrice - 1.35250000 , lotsSumSell - 0.07000000 .
2013.10 . 2 15 : 59 : 0 - Вычисления переменных для текущего тика завершены.
문제는 조건이 동일한 주문에 대해 어떻게 작동할 수 있는지입니다.
       if (OrderType() == OP_BUY) {         
          ...
      }  
       if (OrderType() == OP_SELL) {
          ...
      } 

Mb 나는 무언가를 이해하지 못하지만 논리적으로 다음 순서에 대해 밝혀졌습니다.

OP_BUY == OP_SELL
원칙적으로 이런 일이 발생하는 이유는 중요하지 않습니다. 특정 유형의 미결 주문에 대해 SellCntr++ 및 buyCntr++이 명확하게 실행되는 것이 중요합니다. 해결하는 데 도움이 될까요?
 
Mepkypuu :

안녕하세요, MQL4 프로그래밍 전문가입니다! 이것이 어떻게 가능한지 알려주세요:

프로그램 코드 스니펫:

이 섹션의 로그:

문제는 조건이 동일한 주문에 대해 어떻게 작동할 수 있는지입니다 .

Mb 나는 뭔가를 이해하지 못하지만 논리적으로 다음과 같은 순서로 나타납니다.

원칙적으로 이런 일이 발생하는 이유는 중요하지 않습니다. 특정 유형의 미결 주문에 대해 SellCntr++ 및 buyCntr++이 명확하게 실행되는 것이 중요합니다. 해결하는 데 도움이 될까요?
이것이 같은 순서라는 것을 어떻게 확신할 수 있습니까? 당신은 티켓을 인쇄하지 않습니다 ;).... 확신합니다: 추적할 때 주문 검색이 있습니다.
 TrailingByShadows(OrderTicket(), Period (), 11 , 0 );  ?????????????????????????????? Вы при трале разве ордера не перебираете ?????????? 
 
VladislavVG :
이것이 같은 순서라는 것을 어떻게 확신할 수 있습니까? 당신은 티켓을 인쇄하지 않습니다 ;).... 확신합니다: 추적할 때 주문 검색이 있습니다.

사물의 논리에 따르면 추적해야 하는 특정 주문을 이미 알고 있는데 왜 추적의 주문을 정렬해야 합니까? 무차별 대입은 없습니다. 코드는 다음과 같습니다.

 void TrailingByShadows( int ticket, int tmfrm, int bars_n, int indent) {  
   int i;
   double new_extremum;

   if ((bars_n< 1 ) || (indent< 0 ) || (ticket== 0 ) || ((tmfrm!= 1 ) && (tmfrm!= 5 ) && (tmfrm!= 15 ) && (tmfrm!= 30 ) && (tmfrm!= 60 ) && (tmfrm!= 240 ) && (tmfrm!= 1440 ) && (tmfrm!= 10080 ) && (tmfrm!= 43200 )) || (! OrderSelect (ticket,SELECT_BY_TICKET))) {
       Print ( "Трейлинг функцией TrailingByShadows() невозможен из-за некорректности значений переданных ей аргументов." );
       return ( 0 );
   } 
   if (OrderType()==OP_BUY) {
       for (i = 1 ; i <= bars_n; i++) {
         if (i == 1 ) new_extremum = iLow( Symbol (), tmfrm, i); 
         else if (new_extremum > iLow( Symbol (), tmfrm, i)) new_extremum = iLow( Symbol (), tmfrm, i);
      }
       if (((new_extremum - indent * Point ) > OrderStopLoss() + 1.0 * Point ) || (OrderStopLoss() == 0 ))
       if ((new_extremum - indent * Point ) > OrderOpenPrice())
       if (new_extremum - indent * Point < Bid - MarketInfo( Symbol (), MODE_STOPLEVEL) * Point )
       if (AcountProfitEx(new_extremum) > ProfitSize)
      OrderModify(ticket, OrderOpenPrice(), new_extremum - indent * Point , OrderTakeProfit(), OrderExpiration());
   }
   
   if (OrderType() == OP_SELL) {
       for (i = 1 ; i <= bars_n; i++) {
         if (i == 1 ) new_extremum = iHigh( Symbol (), tmfrm, i); 
         else if (new_extremum < iHigh( Symbol (), tmfrm, i)) new_extremum = iHigh( Symbol (), tmfrm, i);
      }
       if (((new_extremum + (indent + MarketInfo( Symbol (),MODE_SPREAD)) * Point ) < OrderStopLoss() - 1.0 * Point ) || (OrderStopLoss() == 0 )) 
       if ((new_extremum + (indent + MarketInfo( Symbol (),MODE_SPREAD)) * Point ) < OrderOpenPrice())                          
       if ((new_extremum + (indent + MarketInfo( Symbol (),MODE_SPREAD)) * Point > Ask + MarketInfo( Symbol (),MODE_STOPLEVEL) * Point )) 
       if (AcountProfitEx(new_extremum) > ProfitSize)
      OrderModify(ticket, OrderOpenPrice(), new_extremum + (indent + MarketInfo( Symbol (), MODE_SPREAD)) * Point , OrderTakeProfit(), OrderExpiration());
   }      
}
추신: 그런데 이 문제는 실제 조건에서만 발생합니다. 테스터에서 작동하지 않습니다.
 
친애하는 프로그래머 여러분, 다음에 컴퓨터를 다시 시작할 때 터미널을 열면 일반 차트 대신 회색 창이 나타나고 열린 위치 , 어드바이저, 표시기가 사라지고 새 차트를 호출하면 위치가 나타나는 이유를 알려주세요. ,하지만 고문과 표시기가 없어 다시 설치해야했습니다. 그것은 무엇과 연결되어 있습니까? 고맙습니다.
 

이러한 문제가 발생했습니다. 전략 테스터 는 한 번만 작동합니다. 더 정확하게는 테스트 시각화가 한 번 작동하고 다음에 "시작" 버튼을 클릭하면 "시각화" 확인란이 재설정되고 아무 일도 일어나지 않습니다(발생하지 않는 것처럼 보입니다). 어떻게 이기나요?

 
Mepkypuu :

사물의 논리에 따르면 추적해야 하는 특정 주문을 이미 알고 있는데 왜 추적의 주문을 정렬해야 합니까? 무차별 대입은 없습니다. 코드는 다음과 같습니다.

추신: 그런데 이 문제는 실제 조건에서만 발생합니다. 테스터에서 작동하지 않습니다.


다음과 같이 실행해 보세요.

   LogAdd( "Начинаю вычисления переменных для текущего тика ... " );  
   for ( int i = OrdersTotal ()- 1 ; i >= 0 ; i--) 
   {
       if (! OrderSelect (i, SELECT_BY_POS)) continue ;           
       int OrdType=OrderType() ;
       int OrdTckt = OrderTicket(); 
      LogAdd( "Выбираю ордер ( " +i+ " ) с тикетом: " + OrdTckt); 
       if ((OrderOpenTime() > opnTime) && (OrdType == OP_BUY) || (OrdType == OP_SELL)) {    
         opnTime = OrderOpenTime();
         currentTicket = OrderTicket(); 
         currentStopLoss = OrderStopLoss();          
         LogAdd( "Ордер открыт позже предыдущего, не является отложенным. Записываю переменные: opnTime - " + opnTime + ", currentTicket - " + currentTicket + ", currentStopLoss - " + currentStopLoss + "." );
      }
       if (OrdType == OP_BUY) 
      {         
         buyCntr ++;   
         buyOpnPrice = OrderOpenPrice();
         lotsSumBuy += OrderLots();
         TrailingByShadows(OrderTicket(), Period (), 11 , 0 ); 
         LogAdd( "Ордер " +OrdTckt  <-> OrderTicket()+ " не является отложенным, тип ордера - на покупку, обновляю переменные, пытаюсь трейлить: buyCntr - " + buyCntr + ", buyOpnPrice - " + buyOpnPrice + ", lotsSumBuy - " + lotsSumBuy + "." );  
      }  
       if (OrdType== OP_SELL) 
      {
         sellCntr ++;
         sellOpnPrice = OrderOpenPrice();
         lotsSumSell += OrderLots();
         TrailingByShadows(OrderTicket(), Period (), 11 , 0 );
         LogAdd( "Ордер " +OrdTckt  <-> OrderTicket()+ " не является отложенным, тип ордера - на продажу, обновляю переменные, пытаюсь трейлить: sellCntr - " + sellCntr + ", sellOpnPrice - " + sellOpnPrice + ", lotsSumSell - " + lotsSumSell + "." );
      }  
       if (OrderType() == OP_SELLSTOP) 
      {
         sellOpnPrice = OrderOpenPrice();         
         LogAdd( "Ордер " +OrdTckt  <-> OrderTicket()+ " является отложенным, тип ордера - на продажу, фиксирую цену открытия: sellOpnPrice - " + sellOpnPrice + "." );
      }  
       if (OrderType() == OP_BUYSTOP) 
      {
         buyOpnPrice = OrderOpenPrice();
         LogAdd( "Ордер " +OrdTckt  <-> OrderTicket()+ " является отложенным, тип ордера - на покупку, фиксирую цену открытия: buyOpnPrice - " + buyOpnPrice + "." );
      }  
   }
   LogAdd( "Вычисления переменных для текущего тика завершены." ); 

로그에 기록될 내용을 확인하십시오.

 
템플릿을 통하지 않고 프로그래밍 방식으로 들여쓰기를 설정할 수 있습니까? 다음을 통해 들여 쓰기 크기를 얻으십시오.
WindowBarsPerChart() - WindowFirstVisibleBar() - 2 ;

당신은 할 수 있지만 방법을 보여줍니다.

추가됨

템플릿을 통해 프로그래밍 방식으로 가능한 것 같습니다. _lread kernel32.dll 을 사용하여 칠면조로 템플릿을 만듭니다. shift_size 값을 다음을 사용하여 읽습니다. _l 여기에 10에서 50까지의 숫자를 작성합니다. 이 매개변수가 이러한 범위를 가질 수 있는 것 같습니다. 그런 다음 InternalMsg를 통해 템플릿을 로드합니다. 33511인지 35511인지 명확하지 않습니다. WinUser32.mqh에는 첫 번째 옵션이 있지만 두 번째 옵션은 포럼 어디에나 있습니다. 아마도 Zhunko에게 질문할 것입니다. MT5에서는 비교할 수 없을 정도로 쉽습니다. ChartSetString() ChartGetString()을 통해 코드의 어느 곳에서나 CHART_SHIFT_SIZE 를 사용할 수 있습니다... MT4에 다른 옵션이 있을까요? 어리석은 질문이지만...