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

 
Leanid Aladzyeu :

배열에 대해 배우기 시작했습니다.

나는 배열로 주문에 대한 함수를 작성했습니다. 3 배열 = 0 구매, 1= 판매, 2= 총 구매 및 판매 거래.

그런 다음 구매 조건에 if (첫 번째 조건 && 배열 [0] == 0 )을 작성한 다음 구매를 엽니다.

판매를 위해 (첫 번째 조건 && 배열 [1]==0) 판매를 위해 엽니다.

그러나 테스터에서 오류가 발생하고 테스트가 중지됩니다. 무슨 문제가 있습니까? ( "배열 부족" 오류)

따라서 액세스하는 인덱스는 배열 마크업 외부에 있습니다. 예를 들어, 배열[ 3 ]; 그러면 요소 0에서 2까지만 액세스할 수 있습니다. 코드를 확인하십시오.

또한 ArrayResize() 를 사용하여 배열을 표시하지 않았지만 일부 요소를 참조하려고 할 수도 있습니다.

 
코드..
 void Oher( int Mag, string Symb, int &mas[ 2 ])
{
ArrayInitialize ( mas, 0 );

int tip;
int ticket3 =- 1 ;
   for ( int pos= OrdersTotal ()- 1 ; pos>= 0 ; pos--)
     {
     if ( OrderSelect (pos,SELECT_BY_POS,MODE_TRADES) && OrderMagicNumber()==Mag && OrderSymbol()==Symb && OrderTicket()!=ticket3)
          {
          ticket3=OrderTicket();
          tip=OrderType();
          
           switch (tip)
              {
               case 0 :mas[ 0 ]++; mas [ 2 ]++; break ; // 0 покупка
               case 1 :mas[ 1 ]++; mas [ 2 ]++; break ; // 1 продажа
              }
          }
           continue ;
     }

}
Чудо код вставил ) 2 раз получилось за все время что я на сайте)
 
Leanid Aladzyeu :
코드..
스스로 알아내려고 노력하면 테스터는 오류가 발생한 라인과 라인의 위치를 표시해야 합니다.
 
Tapochun :
스스로 알아내려고 노력하면 테스터는 오류가 발생한 라인과 라인의 위치를 표시해야 합니다.

O_o ATP는 다른 것이 무엇인지 몰랐고 터미널은 오류가 있는 곳을 찔렀습니다. 처음으로 치명적인 오류가 발생 했습니다.

   case 1 :mas[ 1 ]++; mas [ 2 ]++; break ; // 1 продажа

그녀에게 침.

 
수정했습니다. 배열이 2개뿐이었고 3이 필요했습니다 . 배열 초기화 와 함수에서 숫자는 +1이 되었습니다. 그리고 획득)
 

표시기의 확인을 구현하는 방법을 알려주세요.

결론은 새로운 바가 생겼을 때 어드바이저가 인디케이터를 참조하고 현재 인디케이터에는 아직 데이터가 없고 이전 바의 데이터를 가져오는 것입니다. 아직 계산)

이 매복을 우회하는 방법. 테스터에서 모든 것이 정상입니다. 데모에서는 괜찮습니다. 그렇지 않습니다!

모두 관련이 없습니다. 결정됐다.

 

안녕하세요 초보자 문제가 있습니다 ...

예를 들어, 시스템이 마지막 막대의 종가와 특정 기간의 고점 및 저점을 비교하도록 강제할 수는 없습니다.

마지막 20바. 내가 무엇을 잘못하고 있지?

 extern int     MAGIC             = 90324752;
extern int     START_HOUR        = 7;
extern int     FINISH_HOUR       = 18;
extern int     TRADE_LIMIT       = 3;
extern int     SMMA_PERIOD       = 100;
extern int     BB_PERIOD         = 50;
extern double  BB_DEV            = 1;
extern double  LOT               = 1;
extern double  StopLoss          = 400;
extern double  TakeProfit        = 2000;

void OnTick()
{
static int    TICKET;

double SMMA                 = iMA (Symbol(),0,SMMA_PERIOD,0,MODE_SMMA,PRICE_CLOSE,0);
double BB_UP                = iBands(Symbol(),0,BB_PERIOD,BB_DEV,0,PRICE_CLOSE,MODE_UPPER,0);       

double HIGHEST              = High[iHighest( Symbol (), 0 ,MODE_HIGH, 20 , 0 )];

if(Hour() >= START_HOUR && Hour() <= FINISH_HOUR && TRADE_COUNT < TRADE_LIMIT && POS_OPENED == FALSE && Seconds() >= 55 )
if(Minute() == 29 || Minute() == 59)
{     
  if(Close[0] > SMMA && Close[0] > BB_UP && Close[ 0 ] >= HIGHEST )

  {
   TICKET = OrderSend ( Symbol (),OP_BUY,LOT,Ask, 0 ,Ask-StopLoss* Point ,Ask+TakeProfit* Point , NULL ,MAGIC, 0 ,Blue);
   if(TICKET < 0)
      {
         Alert("Order Send failed, error # ", GetLastError() );
      } 
  }
}
}


Alert를 통해 확인해보니 이해가 안가는 이유로 테스터는 맨 마지막 틱부터 계산해서 최대값을 주는데 이 값을 줍니다

진드기가있는만큼 주문이 열리지 않습니다.


그리고 두 번째 문제는 EA가 다음 바가 열릴 때까지 기다리게 하는 방법입니다(30m 주기)? 제어점으로 테스트하면 모든 것이 정상이지만 틱으로 테스트하면

그런 다음 어드바이저는 예를 들어 손절매로 마감된 동일한 바에서 즉시 열립니다...


틱 여부에 관계없이 어떻게 거래를 마감할 수 있습니까? 예를 들어, 30m의 기간에 바가 끝나기 5초 전에 주문을 종료하고 싶습니다(29.55, 59.55)

그 순간의 모든 데이터를 기반으로 합니다. 이 단계에서 문제는 5초 이내에 틱이 발생하지 않으면 발생하지 않는다는 것입니다.

논리 연산 이 없으면 신호가 수신되지 않고 다음 신호까지 순간이 누락됩니다. 이론상으로는 쓰레기이지만 실제로 테스터에서 다음 신호는

어떤 이유로 몇 초 후에도 나타납니다.


미리 감사드립니다!
 

댓글에 도움이 됩니다. 주석은 각 막대에 형성됩니다. 각 틱에서 기존 댓글에 더 많은 텍스트를 추가하고 싶습니다.

나는 코드를 호출 :

void UserMarketComment( )

{

   string com=ChartGetString(0,CHART_COMMENT);  // Получаем текст существующего комментария

   string st="Целевой убыток="+DoubleToStr(-inpTargetLoss,2)+" "+AccountCurrency()+"  Текущ";

   if(AccountProfit()<0) st=st+"ий убыток=";

   else st=st+"ая прибыль=";

   st=st+DoubleToStr(AccountProfit(),2)+" "+AccountCurrency()+"  Целевая прибыль="+DoubleToStr(inpTargetProfit,2)+" "+AccountCurrency();

   Comment(com+"",TimeToStr(TimeCurrent(),TIME_SECONDS),"    Spread = ",MarketInfo(Symbol(),MODE_SPREAD),

           "\n ",st);

  }

새 주석을 추가하고 새 줄의 각 눈금에 텍스트를 아래로 슬라이드합니다.

출력하기 전에 마지막 몇 줄을 삭제하려면 어떻게 해야 합니까?

 
ForTorg ZEVs :

댓글에 도움이 됩니다. 주석은 각 막대에 형성됩니다. 각 틱에서 기존 댓글에 더 많은 텍스트를 추가하고 싶습니다.

나는 코드를 호출 :

void UserMarketComment( )

{

   string com=ChartGetString(0,CHART_COMMENT);  // Получаем текст существующего комментария

   string st="Целевой убыток="+DoubleToStr(-inpTargetLoss,2)+" "+AccountCurrency()+"  Текущ";

   if(AccountProfit()<0) st=st+"ий убыток=";

   else st=st+"ая прибыль=";

   st=st+DoubleToStr(AccountProfit(),2)+" "+AccountCurrency()+"  Целевая прибыль="+DoubleToStr(inpTargetProfit,2)+" "+AccountCurrency();

   Comment(com+"",TimeToStr(TimeCurrent(),TIME_SECONDS),"    Spread = ",MarketInfo(Symbol(),MODE_SPREAD),

           "\n ",st);

  }

새 주석을 추가하고 새 줄의 각 눈금에 텍스트를 아래로 슬라이드합니다.

출력하기 전에 마지막 몇 줄을 삭제하려면 어떻게 해야 합니까?

댓글()만 완전히 대체할 수 있는 것 같습니다.

따라서 각 틱에 대한 주석의 일부를 변경하려면 각 틱에 대한 주석을 완전히 변경해야 합니다.

 
ForTorg ZEVs :

댓글에 도움이 됩니다. 주석은 각 막대에 형성됩니다. 각 틱에서 기존 댓글에 더 많은 텍스트를 추가하고 싶습니다.

나는 코드를 호출 :

void UserMarketComment( )

{

   string com=ChartGetString(0,CHART_COMMENT);  // Получаем текст существующего комментария

   string st="Целевой убыток="+DoubleToStr(-inpTargetLoss,2)+" "+AccountCurrency()+"  Текущ";

   if(AccountProfit()<0) st=st+"ий убыток=";

   else st=st+"ая прибыль=";

   st=st+DoubleToStr(AccountProfit(),2)+" "+AccountCurrency()+"  Целевая прибыль="+DoubleToStr(inpTargetProfit,2)+" "+AccountCurrency();

   Comment(com+"",TimeToStr(TimeCurrent(),TIME_SECONDS),"    Spread = ",MarketInfo(Symbol(),MODE_SPREAD),

           "\n ",st);

  }

새 주석을 추가하고 새 줄의 각 눈금에 텍스트를 아래로 슬라이드합니다.

출력하기 전에 마지막 몇 줄을 삭제하려면 어떻게 해야 합니까?

따라서 주석에 제어 문자 "\n"이 있습니다. 이것은 줄 바꿈 문자입니다. 제거하면 여러 줄이 없습니다.
사유: