[ARCHIVE] 포럼을 어지럽히 지 않도록 초보자 질문. 프로, 놓치지 마세요. 너 없이는 아무데도 - 3. - 페이지 546

 

EA에는 다음 블록(이벤트 카운터)이 있습니다.

if (isCloseLastPosByStop()==True) //마지막 주문이 Stop에 의해 종료된 경우

{
N=N+1;
경고 (N, "무스");
} 그렇지 않으면 N=0;

질문: 화면에 정보를 표시하는 대신 파일(엑셀)에 데이터를 쓰는 방법은 무엇입니까?

 
Dimka-novitsek :

안녕하세요! 어떻게 될 수 있는지 말해 주세요. 한 주기에서 주문을 선택하고 마지막 주문을 정렬하고 다음과 같이 기억합니다. ticket = OrderTicket();

이 경우 2번이라고 합시다. 조금 후에 (티켓>-1){
OrderSelect(티켓,SELECT_BY_TICKET,MODE_HISTORY);

그리고 종종 오류 4105가 발생합니다 - 주문이 선택되지 않았습니다!!


하지만 아직 주문이 마감되지 않았기 때문입니다. MODE_HISTORY가 아니라 MODE_TRADES에 있습니다.
 

for (  i= 0 ;i<= OrdersHistoryTotal ();i++){
     OrderSelect (i ,SELECT_BY_POS,MODE_HISTORY);
     if ( OrderMagicNumber ( )== magic) { if ( OrderSymbol ()== Symbol ()) {





 current = OrderOpenTime ();   Alert ( " current = OrderOpenTime(); " ,  current); Alert ( " max " , max );
      
       if (current > max) 
      {                    
         max = current;      
         ticket = OrderTicket ();   Alert ( " ticket = OrderTicket();  " , ticket );
      }}}}


       if (ticket>- 1 ){
       OrderSelect ( ticket,SELECT_BY_TICKET,MODE_HISTORY);Alert ("SELL Select error HISTORYticket ", GetLastError( )  ) ;

너 뭐야! 왜 안 돼? 검색 당시 미결 주문이 없었습니다! 내가 이해하지 못한 건 아닐까?

그리고 열거 주기도 역사입니다! 내가 int 티켓 변수를 할당하는 곳

그리고 swears, 죄송합니다, 그래서 2012.02.04 11:28:47 2011.12.06 16:35 antibes EURUSD,M30: Alert: SELL Select error HISTORYticket 4105

언제 MODE_HISTORY에서 MODE_TRADES로 이동합니까?

그리고 가장 중요한 것은 결국 내가 주문 선택의 도움으로 역사에서도 동일한 주문을 선택하고 처음에는 선택된다는 것입니다. 그렇지 않으면 작업할 수 없었을 것입니다!! 논리가 없다!!!!!! 깜놀..

 
Dimka-novitsek :

너 뭐야! 왜 안 돼? 검색 당시 미결 주문이 없었습니다! 내가 이해하지 못한 건 아닐까?

그리고 열거 주기도 역사입니다! 내가 int 티켓 변수를 할당하는 곳

그리고 swears, 죄송합니다, 그래서 2012.02.04 11:28:47 2011.12.06 16:35 antibes EURUSD,M30: Alert: SELL Select error HISTORYticket 4105

언제 MODE_HISTORY에서 MODE_TRADES로 이동합니까?


 ticket=-1;
for (  i= 0 ;i< OrdersHistoryTotal ();i++){
     if ( OrderSelect (i ,SELECT_BY_POS,MODE_HISTORY));{
     if ( OrderMagicNumber ( )== magic) { if ( OrderSymbol ()== Symbol ()) {





 current = OrderOpenTime ();   Alert ( " current = OrderOpenTime(); " ,  current); Alert ( " max " , max );
      
       if (current > max) 
      {                    
         max = current;      
         ticket = OrderTicket ();   Alert ( " ticket = OrderTicket();  " , ticket );
      }}}}}


       if (ticket>- 1 ){
       OrderSelect ( ticket,SELECT_BY_TICKETJ ,MODE_HISTORY); Alert ( "SELL Select error HISTORYticket " , GetLastError ( )  ) ;
시작 부분에 한 줄을 추가 하고 다음 두 줄의 코드를 수정했습니다.
 
감사해요!!
 

조언자에 손절매를 삽입하는 데 도움

제발

파일:
my_1.mq4  10 kb
 
오픈 포지션 을 고려한 최대 허용 로트, 즉 자기자본으로 계산하는 기능을 공유해주세요. 그렇지 않으면 표준은 위험을 고려하지만 거래가 있으면 열 돈이 충분하지 않습니다.
 
TG :
오픈 포지션, 즉 자기자본으로 최대 허용 로트를 계산하는 기능을 공유해 주세요. 그렇지 않으면 표준은 위험을 고려하지만 거래가 있으면 열 돈이 충분하지 않습니다.


다음과 같은 가장 간단한 경우:

 double Klots = 0.1 ; //коэфф. риска (определяет желаемый размер лота от максимально возможного в данный момент.)

Lots= NormalizeDouble (Klots* AccountFreeMargin ()/ MarketInfo ( Symbol (),MODE_MARGINREQUIRED), 2 );Lots= MathMax ( MarketInfo ( Symbol (),MODE_MINLOT),Lots);
 

얘들아 나에게 이것에 대해 말해줘:

다음은 hrenfx에서 지그재그로 롤백하지 않는 최대 크기를 찾는 스크립트입니다. 여기 를 참조하세요.

 #property show_inputs

extern int MinPips = 100 ;
extern datetime StartTime = D'2011.03.24' ;
extern datetime EndTime = D'2011.12.31' ;

#define MAX_POINTS 10000

// Заполняет массив размерами колен ЗигЗага с условием колена >= MinPips пунктов
int GetZigZagData( int MinPips, datetime & StartTime, datetime & EndTime, int & Data[] )
{
   bool FlagUP = TRUE;
   int Pos = iBarShift ( Symbol (), Period (), StartTime);
   int PosEnd = iBarShift ( Symbol (), Period (), EndTime);
   int Max = High[Pos] / Point + 0.1 ;
   int Min = Low[Pos] / Point + 0.1 ;
   int Count = 0 ;
   int PriceHigh, PriceLow;
 
  StartTime = Time[Pos];
  EndTime = Time[PosEnd];
  
   ArrayResize (Data, MAX_POINTS);

  Pos--;
  
   while (Pos >= PosEnd)
  {
    PriceHigh = High[Pos] / Point + 0.1 ;
    PriceLow = Low[Pos] / Point + 0.1 ;   

     if (FlagUP)
    {
       if (PriceHigh > Max)
        Max = PriceHigh;
       else if (Max - PriceLow >= MinPips)
      {
        Data[Count] = Max - Min;
        Count++;
        
        FlagUP = FALSE;
        Min = PriceLow;
      }
    }
     else
    {
       if (PriceLow < Min)
        Min = PriceLow;
       else if (PriceHigh - Min >= MinPips)
      {
        Data[Count] = Max - Min;
        Count++;
        
        FlagUP = TRUE;
        Max = PriceHigh;
      }
    }
    
    Pos--;
  }
  
   ArrayResize (Data, Count);
    
   return (Count);
}

void start()
{
   int ZigZagData[];
   int Amount = GetZigZagData(MinPips, StartTime, EndTime, ZigZagData);
  
   ArraySort (ZigZagData);
  
   Print ( "На интервале " + TimeToStr (StartTime) + " - " + TimeToStr (EndTime) +
         " максимальное безоткатное (> " + MinPips +
         " пунктов) движение " + ZigZagData[Amount - 1 ] + " пунктов." );
        
   return ;
}

M5의 기기 차트에 던졌습니다. 기본 시간 범위로 정상적으로 계산됩니다.

 extern datetime StartTime = D'2011.03.24' ;
extern datetime EndTime = D'2011.12.31' ;

이것은 F2를 통해 다운로드 할 때 Alpari 사무실에서 악기에 대한 기록의 최대 깊이입니다. 클라이언트 터미널의 "전문가" 탭의 내용처럼 보입니다. 사실인 것 같습니다.

동일한 시간 간격, 동일한 기간에 Expert Advisor에서 동일한 스크립트 구성을 사용하는 경우 M5 차트가 올바르게 계산되지 않습니다.

완전히 다른(스크립트보다 작은) 숫자 또는 0을 씁니다. 오류가 무엇일 수 있습니까? 아니면 일종의 기록 불일치입니까? 덕분에.

저것들. 나는 이론상 롤백이 없는 것을 찾는 예상 시간보다 늦게 올빼미 테스터에서 시작합니다.

 

이 스크립트를 올빼미에 로드하는 방법은 다음과 같습니다.

 extern string A3 = "Расчет безотката" ;
//РАСЧЕТ БЕЗОТКАТА ДЛЯ РАССТАВЛЕНИЯ ОРДЕРОВ С ЗАДАННЫМ ШАГОМ
extern int MinPips = 100 ;
extern datetime StartTime = D'2011.03.24' ;
extern datetime EndTime = D'2011.12.31' ;
#define MAX_POINTS 1000000

//extern double grid = 1000;          // размер безотката в пунктах



//+------------------------------------------------------------------+
//| Старт робота                                                     |
//+------------------------------------------------------------------+

int init()
{   
       
   //------------------     ШАГ СЕТКИ   ---------------------------------------------------------------------------------------

 //Pipstep = grid/Max_Iteration;
 //Pipstep = NormalizeDouble(Pipstep,0);  
 // СЧИТАЕМ БЕЗОТКАТ
     int ZigZagData[];
     int Amount = GetZigZagData(MinPips, StartTime, EndTime, ZigZagData);
  
     ArraySort (ZigZagData);
  
     Print ( "На интервале " + TimeToStr (StartTime) + " - " + TimeToStr (EndTime) +
         " максимальное безоткатное (> " + MinPips +
         " пунктов) движение " + ZigZagData[Amount - 1 ] + " пунктов." );        

  
   
     return ( 0 );
}

...
...

// Заполняет массив размерами колен ЗигЗага с условием колена >= MinPips пунктов
int GetZigZagData( int MinPips, datetime & StartTime, datetime & EndTime, int & Data[] )
{
   bool FlagUP = TRUE;
   int Pos = iBarShift ( Symbol (), Period (), StartTime);
   int PosEnd = iBarShift ( Symbol (), Period (), EndTime);
   int Max = High[Pos] / Point + 0.1 ;
   int Min = Low[Pos] / Point + 0.1 ;
   int Count = 0 ;
   int PriceHigh, PriceLow;
 
  StartTime = Time[Pos];
  EndTime = Time[PosEnd];
  
   ArrayResize (Data, MAX_POINTS);

  Pos--;
  
   while (Pos >= PosEnd)
  {
    PriceHigh = High[Pos] / Point + 0.1 ;
    PriceLow = Low[Pos] / Point + 0.1 ;   

     if (FlagUP)
    {
       if (PriceHigh > Max)
        Max = PriceHigh;
       else if (Max - PriceLow >= MinPips)
      {
        Data[Count] = Max - Min;
        Count++;
        
        FlagUP = FALSE;
        Min = PriceLow;
      }
    }
     else
    {
       if (PriceLow < Min)
        Min = PriceLow;
       else if (PriceHigh - Min >= MinPips)
      {
        Data[Count] = Max - Min;
        Count++;
        
        FlagUP = TRUE;
        Max = PriceHigh;
      }
    }
    
    Pos--;
  }
  
   ArrayResize (Data, Count);
    
   return (Count);
}

모든 것이 동일한 것 같습니다. 무엇이 잘못되었을 수 있습니까?