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

 
hoz :



 double lastOrderCloseTime = - 1 ,                   // Время закрытия последнего ордера
        lastOrderOpenTime = - 1 ;                     // Время открытия последнего ордера
어??

유형, int 또는 datetime
 
artmedia70 :
빈 표시기 창에 메시지를 표시하는 함수를 만든 적이 있습니다. 출력 라인의 색상을 사용자 정의할 수 있습니다. 그녀는 이미 조정되었습니다. 그렇다면 공유할 수 있습니다.


귀하의 코드 Artyom을 기꺼이 살펴보겠습니다. 테스트를 위해 인쇄가 가장 편리한 옵션이 아닙니다 ...
 

r772ra :

 double lastOrderCloseTime = - 1 ,                   // Время закрытия последнего ордера
        lastOrderOpenTime = - 1 ;                     // Время открытия последнего ордера

어??


유형, int 또는 datetime

여기에서 그는 모든 불명예를 전달했으며 다음과 같이 밝혀졌습니다.

 //+-------------------------------------------------------------------------------------+
//| Получаем состояние последней позиции (Открыта или закрыта)                          |
//+-------------------------------------------------------------------------------------+
datetime GetLastOrderState()
{
   datetime lastOrderCloseTime = - 1 ,                   // Время закрытия последнего ордера
            lastOrderOpenTime = - 1 ;                     // Время открытия последнего ордера
   
   for ( int i= OrdersTotal ()- 1 ; i>= 0 ; i--)
   {
       if (! OrderSelect (i, SELECT_BY_POS)) continue ;
       if (OrderMagicNumber() != i_magic) continue ;
       if (OrderSymbol() != Symbol ()) continue ;
  
       if (lastOrderOpenTime < OrderOpenTime())
      {
          lastOrderOpenTime = OrderOpenTime();
          lastOrderCloseTime = OrderCloseTime();
      }
   }
   Comment ( "Время закрытия последнего открытого ордера = " , lastOrderCloseTime);
   return (lastOrderCloseTime);
}

어떤 이유로 주문이 마감된 경우에도 마지막 주문의 마감 시간이 각각 0이 아닙니다 .

그리고 주석에는 지속적으로 표시됩니다.

Время закрытия последнего открытого ордера = 0

따라서 각각 코드에 따라 더 이상 작동하지 않습니다. 이 기능이 작동하지 않습니다..

 
hoz :

여기에서 그는 모든 불명예를 전달했으며 다음과 같이 밝혀졌습니다.

어떤 이유로 주문이 마감된 경우에도 마지막 주문의 마감 시간이 각각 0이 아닙니다 .

그리고 주석에는 지속적으로 표시됩니다.

따라서 각각 코드에 따라 더 이상 작동하지 않습니다. 이 기능이 작동하지 않습니다..

당신은 그것을 가지고 있으며 보류중인 주문 을 고려합니다. 글쎄요, 따라서 미결 주문을 살펴봅니다. 당연히 종료 시간이 0으로 반환됩니다.

마감된 주문을 보려면 마감된 목록을 확인해야 합니다.

 for ( int i= OrdersHistoryTotal ()- 1 ; i>= 0 ; i--)

그리고

 if (! OrderSelect (i, SELECT_BY_POS, MODE_HISTORY)) continue ;

그러나 ... 두 가지 기능을 만들어야 합니다. 하나는 열린 기능을 찾고 다른 하나는 닫힌 기능을 찾습니다.

 
artmedia70 :

당신은 그것을 가지고 있으며 보류중인 주문을 고려합니다. 글쎄요, 따라서 미결 주문을 살펴봅니다. 당연히 종료 시간이 0으로 반환됩니다.

마감된 주문을 보려면 마감된 목록을 확인해야 합니다.

그리고

그러나 ... 두 가지 기능을 만들어야 합니다. 하나는 열린 기능을 찾고 다른 하나는 닫힌 기능을 찾습니다.


Artyom 감사합니다. 정확히는... 다음은 코드 최적화 문제입니다 . 코드의 구조에 대한 질문이 있지만 신선한 마음으로 작성해야 합니다.
 
hoz :

귀하의 코드 Artyom을 기꺼이 살펴보겠습니다. 테스트를 위해 인쇄가 가장 편리한 옵션이 아닙니다 ...

다음은 기능을 테스트하기 위한 EA입니다. 사실, 그 안에는 함수 자체와 그 호출이 있습니다. 전화를 걸기 전에 최대 4줄의 메시지를 준비해야 합니다. 내 기억이 맞다면 각 줄의 길이는 64자를 넘지 않아야 합니다. 그래서 하나의 메시지를 여러 줄로 나누었습니다. 한 메시지의 각 줄은 고유한 색상으로 표시될 수 있습니다. 코드에서 모든 것이 명확해 보입니다. 먼저 메시지 줄을 준비한 다음 . 나는 거기에 구체적으로 언급하지 않았습니다. 나는 오랫동안 한 호흡으로 썼습니다. 지금은 그것이 무엇을 위한 것인지 잊었습니다. 질문이 있으면 기억할 것입니다. 이제 가장 필요한 것만 기억했습니다.

 //+------------------------------------------------------------------+
//|                                                Test iPrint().mq4 |
//|                             Copyright © 2013, Artyom A. Trishkin |
//|                                                skype: artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2013, Artyom A. Trishkin"
#property link       "skype: artmedia70"
//+------------------------------------------------------------------+
//| expert variables                                                 |
//+------------------------------------------------------------------+
int             a,b,c;
string          Exp_Name, Prefix, pref,
               message1, message2, message3, message4, 
               Mass_Name_Message[ 10 ];
//+----------------------------------------------------------------------------+
int init() {
   Exp_Name=WindowExpertName(); 
   pref= "_r" ;
   if (IsDemo()) pref= "_d" ;
   if (IsTesting()) pref= "_t" ;
   if (IsVisualMode()) pref= "_v" ;
   Prefix=Exp_Name+ "_" + Symbol ()+pref;  
//----------------------------
   return ;                                         // Выход из init() 
}
//+----------------------------------------------------------------------------+
int deinit() {
   if (!IsTesting()) {
       Comment ( "" );
// -------- Блок удаления всех объектов, построенных на графике --------
       string Name_Del[ 1 ]; 
       int Quant_Del= 0 ;                    
       int Quant_Objects= ObjectsTotal ();   
       int LenPref= StringLen (Prefix);
       ArrayResize (Name_Del,Quant_Objects);
       for ( int k= 0 ; k<Quant_Objects; k++) {
         string Obj_Name= ObjectName (k);   
         string Head= StringSubstr (Obj_Name, 0 ,LenPref);
         if (Head==Prefix) {                              
            Quant_Del+= 1 ;        
            Name_Del[Quant_Del- 1 ]=Obj_Name;
            }
        }
       for ( int i= 0 ; i<Quant_Del; i++)    
         ObjectDelete (Name_Del[i]); 
// ----- Конец блока удаления всех объектов, построенных на графике -----
      }
   return ;                                 // Выход из deinit()
}
//+----------------------------------------------------------------------------+
int start()
  {
//-------------------------------------------------------
// Подготавливаем первое сообщение
   message1= StringConcatenate ( "Первое сообщение из двух строк: Тик: " , GetTickCount (), " " );
   message2= StringConcatenate ( "Цена Bid: " , DoubleToStr(Bid, Digits ));
   iPrint( false , message1, message2, "" , "" , 9 , Aqua, DarkOrange);   // Выводим первое
   Sleep ( 3000 );
//-------------------------------------------------------
// Подготавливаем второе сообщение
   b= 4 ; c= 7 ;
   a=b+c;
   message1= StringConcatenate ( "Второе сообщение из трёх строк: a=" ,a, " " );
   message2= StringConcatenate ( "b=" ,b, " " );
   message3= StringConcatenate ( "c=" ,c);
   iPrint( false , message1, message2, message3, "" , 9 , Aqua, LimeGreen, DarkOrange); // Выводим второе
   Sleep ( 3000 );
//-------------------------------------------------------
// Подготавливаем третье сообщение
   message1= StringConcatenate ( "Третье сообщение из четырёх строк: Время: " , TimeToStr( TimeCurrent ()), " " );
   message2= StringConcatenate ( "Тик: " , GetTickCount (), " " );
   message3= StringConcatenate ( "Время бара: " ,TimeToStr(Time[ 0 ]), " " );
   message4= StringConcatenate ( "Цена Bid: " , DoubleToStr(Bid, Digits ));
   iPrint( false , message1, message2, message3, message4, 9 , Aqua, Aqua, Aqua, DarkOrange); // Выводим третье
   Sleep ( 3000 );
//-------------------------------------------------------
   return ( 0 );
  }
//+----------------------------------------------------------------------------+
// Если bool print = true или нет окна индикатора, то функция будет выводить сообщения в журнал
void iPrint( bool print, string mess1, string mess2= "" , string mess3= "" , string mess4= "" , 
             int sz= 9 , color cl1=Aqua, color cl2=Aqua, color cl3=Aqua, color cl4=Aqua) {
   string    NameGrafText, message, nm;
   int       i, y, k, LenStr, shift, Win_Num=- 1 , num= 0 ;
   color     cl;
   if (mess1== "" ) {
       Print ( "Func iPrint: Передана пустая строка, выходим" );
       return ;
      }
   Win_Num=WindowFind( "Win_Inform" );
   if (print || Win_Num< 0 ) {
      message=mess1+mess2+mess3+mess4;
       Print (message); 
       return ;
      }
   k= ArraySize (Mass_Name_Message)- 1 ;
   if ( StringLen (mess1)> 0 ) num++;
   if ( StringLen (mess2)> 0 ) num++;
   if ( StringLen (mess3)> 0 ) num++;
   if ( StringLen (mess4)> 0 ) num++;
   for (i=k; i>= 0 ; i--) {                             
      NameGrafText=Mass_Name_Message[i];           
       if ( StringLen (NameGrafText)> 0 )
       if ( ObjectFind (NameGrafText)==Win_Num) {
         if (i+num>k) {
             ObjectDelete (NameGrafText);  
            Mass_Name_Message[i]= "" ;
            }
         else if (i+num<=k) {             // Сдвигаем и перекрашиваем старые сообщения
            Mass_Name_Message[i+num]=Mass_Name_Message[i];
            y=ObjectGet(NameGrafText, OBJPROP_YDISTANCE );               // координата Y
            ObjectSet  (NameGrafText, OBJPROP_YDISTANCE , y+(sz+ 1 )*num); // координата Y
            ObjectSet  (NameGrafText, OBJPROP_COLOR , DimGray);           // цвет
            }
         }
      }
   shift=num;
   int v= GetTickCount ();
   for (i= 0 ; i<num; i++) {
      shift--;
      NameGrafText=Prefix+ "_Graf_Text_" +i+ "_" + Symbol ()+ "_" +v;   // Уникальное имя объекта
       int app= 0 ;
       while ( ObjectFind (NameGrafText)==Win_Num) {
         app++;
         NameGrafText=Prefix+ "_Graf_Text_" +i+ "_" + Symbol ()+ "_" +v+ "_" +app;
         }
      Mass_Name_Message[num- 1 -i]=NameGrafText;
       switch (i) {
         case 0 : message=mess1; cl=cl1; break ;
         case 1 : message=mess2; cl=cl2; break ;
         case 2 : message=mess3; cl=cl3; break ;
         case 3 : message=mess4; cl=cl4; break ;
         default :message=mess1; cl=cl1; break ;
         }
       ObjectCreate (NameGrafText, OBJ_LABEL , Win_Num, 0 , 0 );
      ObjectSetText(NameGrafText, message, sz, "Courier New" , cl);
      ObjectSet    (NameGrafText, OBJPROP_COLOR , cl);                   // цвет
      ObjectSet    (NameGrafText, OBJPROP_CORNER ,     2 );                 // угол
      ObjectSet    (NameGrafText, OBJPROP_XDISTANCE , 150 );               // координата Х
      ObjectSet    (NameGrafText, OBJPROP_YDISTANCE , 2 +(sz+ 1 )*shift);   // координата Y
      WindowRedraw();
      }
//---------------------------------      
   nm=Prefix+ "_Balance_txt" ;
   message= "Баланс :" ;
   cl=Yellow;
   SetText(message, cl, nm, 2 , 4 , 20 , "Arial" , 9 , Win_Num);
   nm=Prefix+ "_Balance" ;
   message=DoubleToStr(AccountBalance(), 2 );
   cl=DarkTurquoise;
   SetText(message, cl, nm, 2 , 70 , 20 , "Arial" , 9 , Win_Num);
//---------------------------------      
   nm=Prefix+ "_Equity_txt" ;
   message= "Средства :" ;
   cl=Yellow;
   SetText(message, cl, nm, 2 , 4 , 8 , "Arial" , 9 , Win_Num);
   nm=Prefix+ "_Equity" ;
   message=DoubleToStr(AccountEquity(), 2 );
   cl=DarkTurquoise;
   SetText(message, cl, nm, 2 , 70 , 8 , "Arial" , 9 , Win_Num);
//---------------------------------      
}
//+----------------------------------------------------------------------------+
void SetText( string Text, color cl, string nm, int angle, int x, int y, string font, int sz= 0 , int wnd= 0 ) {
   if ( ObjectFind (nm)< 0 ) ObjectCreate (nm, OBJ_LABEL , wnd, 0 , 0 );
   ObjectSet(nm, OBJPROP_CORNER    , angle);
   ObjectSet(nm, OBJPROP_XDISTANCE , x);
   ObjectSet(nm, OBJPROP_YDISTANCE , y);
   ObjectSet(nm, OBJPROP_WIDTH     , sz);
   ObjectSetText(nm, Text, sz, font, cl);
   }
//+----------------------------------------------------------------------------+

음, 칠면조:

 //+------------------------------------------------------------------+
//|                                                   Win_Inform.mq4 |
//|                                Copyright © 2012, Artyom Trishkin |
//|                                                skype: artmedia70 |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2012, Artyom Trishkin"
#property link       "skype: artmedia70"

#property indicator_separate_window
int start()
  {
  }
//+------------------------------------------------------------------+

이런 ... 이해 바랍니다.

물론 칠면조 창을 띄우는 대신 배경을 만들어 메인 차트에 띄워도 되지만 너무 게을러서... :)

 
artmedia70 :

다음은 기능을 테스트하기 위한 EA입니다. 사실, 그 안에는 함수 자체와 그 호출이 있습니다. 전화를 걸기 전에 최대 4줄의 메시지를 준비해야 합니다. 내 기억이 맞다면 각 줄의 길이는 64자를 넘지 않아야 합니다. 그래서 하나의 메시지를 여러 줄로 나누었습니다. 한 메시지의 각 줄은 고유한 색상으로 표시될 수 있습니다. 코드에서 모든 것이 명확해 보입니다. 먼저 메시지 라인을 준비한 다음 함수를 호출합니다. 나는 거기에 구체적으로 언급하지 않았습니다. 나는 오랫동안 한 호흡으로 썼습니다. 지금은 그것이 무엇을 위한 것인지 잊었습니다. 질문이 있으면 기억할 것입니다. 이제 가장 필요한 것만 기억했습니다.

음, 칠면조:

이런 ... 이해 바랍니다.

물론 칠면조 창을 띄우는 대신 배경을 만들어 메인 차트에 띄워도 되지만 너무 게을러서... :)


 

착한 사람들! 나는 고문을 썼습니다. 실생활에서 모든 것이 명확하게 작동하고 모든 것이 잘되는 것 같습니다. 그리고 테스터를 확인합니다. 버그가 있습니다. 요점은 다음과 같습니다. 고문은 차트에 표시된 수평선 에서 주문을 열어야 합니다. 그리고 테스터에서 그는 라인이 많은 것처럼 모든 레벨에서 끝없이 열립니다. 무슨 일인지 설명해?

라인을 담당하는 코드의 일부:

int New_horizont()

{

int tip_o_buy;

int tip_o_sell;

int obj_total=ObjectsTotal();

// 새 줄이 없으면 종료

if(obj_total==0)

반품;

// 만약 거기에...

if(obj_total!=0)

문자열 이름=개체 이름(0);

이중 pr=NormalizeDouble(ObjectGet(이름,1),자리수);

개체삭제(이름); // 제거하고 다시 설정

if(pr>Bid+(Stop_level+1)*Point) // 주문 유형 결정

{

tip_o_sell=OP_SELLLIMIT;

tip_o_buy=OP_BUYSTOP;

}

if(pr<Bid-(Stop_level+1)*포인트)

{

tip_o_sell=OP_SELLSTOP;

tip_o_buy=OP_BUYLIMIT;

}

// 주문 설정

OrderSend(Symb,tip_o_sell,Value,pr,3,pr+StopLoss*Point,pr-TakeProfit*Point,"주문 접수");

prov_error();

...........................................

}

즉, obj_total==0이라는 아이디어에 따르면 그게 전부입니다. 그리고 어떤 이유로 그는 모든 것을 무한대로 설치하고 설치합니다.

 
안녕 모두.
대기 중인 주문 이 발생했다고 로그에 표시되지 않는 것이 정상입니까? 이것은 테스터에서 발생합니다.
계정은 진짜입니다.
 
Dozol :

착한 사람들! 나는 고문을 썼습니다. 실생활에서 모든 것이 명확하게 작동하고 모든 것이 잘되는 것 같습니다. 그리고 테스터를 확인합니다. 버그가 있습니다.


나는 이 EA가 실생활이나 테스터에서 작동하지 않을 것이라고 생각하지 않습니다.