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

 
Kapizdo4ka :

안녕하세요! if esle 문이 때때로 저에게 효과가 없는 이유를 알려주세요.
다음은 예입니다.

어디에:
H3는 레벨의 가격 값입니다.
가격 - 현재 가격

결과적으로 가격이 이 수준에 도달했지만(때로는 그 수준에서 멈추기도 함) 경고가 작동하지 않습니다.
무슨 일이야?

가격 이 레벨의 가치 와 정확히 일치하는 경우는 거의 없다는 사실. 가격 >= H3이거나 오류 범위를 정의하십시오.
 
//+------------------------------------------------------------------+
//|                                                        Ozero.mq4 |
//|                                            Copyright 2014, Vinin |
//|                                             http://vinin.ucoz.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Vinin"
#property link        "http://vinin.ucoz.ru"
#property version    "1.00"
#property strict
// -------- переменные --- Н -----
extern double gLot= 0.1 ;             // размер лота для покупки 
extern double gPoint= 0.001 ;
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
// -------- переменные --- К ----- 
int init()
  {
   return ( 0 );
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
int start()
  {

// Открытие позиции
   if ( OrdersTotal ()== 0 )
     {
       Print ( " Открытие первой позиции " );
       double _Ask=MarketInfo( "GBPUSD" ,MODE_ASK);
       int ticket= OrderSend ( "GBPUSD" ,OP_BUY,gLot,_Ask, 15 , 0 , 0 );
       if (ticket> 0 )
        {
         Print ( " ОРДЕР ОТКРЫТ " ,ticket);
        }
     }

   double _Bid=MarketInfo( "GBPUSD" ,MODE_BID); //для цены
   for ( int pos= OrdersTotal ()- 1 ;pos>= 0 ;pos--)
     {
       if ( OrderSelect (pos,SELECT_BY_POS))
        {
         if (OrderOpenPrice()+gPoint<_Bid)
           {
            OrderClose(OrderTicket(),OrderLots(),_Bid, 15 );
            
ResetLastError ();
if (!OrderClose(OrderTicket(),OrderLots(),_Bid, 15 )) Print ( "Чё-та не закрылася позиция. Фигня вот такая происходит: " + GetLastError ());

           }
        }
     }
   return ( 0 );
  }

좋은 아침.

프로그램은 이렇게 생겼습니다.

컴파일하면 다음이 생성됩니다.

'오제로.mq4' 오제로.mq4 1 1
'OrderClose'의 반환 값을 확인해야 합니다. Ozero.mq4 46 13
'숫자'에서 '문자열'로의 암시적 변환 Ozero.mq4 49 117
오류 0개, 경고 2개 1 3


"결과" 탭에서 주문이 열리고 닫히는 것을 볼 수 있습니다.

1 2014.08.25 00:00 매수 1 0.10 1.6550 0.0000 0.0000 0.00 10000.00
2 2014.08.25 06:30 종가 1 0.10 1.6562 0.0000 0.0000 0.12 10000.12
3 2014.08.25 06:31 매수 2 0.10 1.6564 0.0000 0.0000 0.00 10000.12
4 2014.08.25 10:00 마감 2 0.10 1.6574 0.0000 0.0000 0.10 10000.22
5 2014.08.25 10:00 매수 3 0.10 1.6576 0.0000 0.0000 0.00 10000.22
6 2014.08.25 12:58 종가 3 0.10 1.6586 0.0000 0.0000 0.10 10000.32
7 2014.08.25 12:58 매수 4 0.10 1.6590 0.0000 0.0000 0.00 10000.32
8 2014.08.26 13:13 종가 4 0.10 1.6576 0.0000 0.0000 -0.14 10000.18


8 - 테스터를 닫아서 작업을 중단했습니다.


다음으로 "일지"를 보십시오.

2014.10.31 07:46:44.837 GBPUSD,M15: 312876ms(총 시간 324436ms) 내에 처리된 4453개의 틱 이벤트(5608개 막대, 340128개 막대 상태)
2014.10.31 07:46:44.837 2014.08.26 13:13 테스터: 4번 주문 마감
2014.10.31 07:46:44.798 2014.08.26 13:13 비주얼 테스터 정지
2014.10.31 07:43:15.315 2014.08.25 12:58 오제로 GBPUSD,M15: 주문오픈 4
2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15: 오픈 #4 1.6590 ok에서 0.10 GBPUSD 매수
2014.10.31 07:43:15.315 2014.08.25 12:58 Ozero GBPUSD,M15: 첫 포지션 오픈
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: 포지션이 마감되지 않았습니다. 이 쓰레기가 일어나고 있습니다: 4108
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: OrderClose 오류 4108
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: OrderClose 기능에 대한 알 수 없는 티켓 3
2014.10.31 07:43:15.245 2014.08.25 12:58 Ozero GBPUSD,M15: #3 종가 0.10 GBPUSD 1.6576, 가격 1.6586
2014.10.31 07:42:51.123 2014.08.25 10:00 오제로 GBPUSD,M15: 주문오픈 3
2014.10.31 07:42:51.123 2014.08.25 10:00 Ozero GBPUSD,M15: 오픈 #3 1.6576 ok에서 0.10 GBPUSD 매수
2014.10.31 07:42:51.123 2014.08.25 10:00 Ozero GBPUSD,M15: 첫 포지션 오픈
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: 포지션이 마감되지 않았습니다. 이 쓰레기가 일어나고 있습니다: 4108
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: OrderClose 오류 4108
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: OrderClose 기능에 대한 알 수 없는 티켓 2
2014.10.31 07:42:51.059 2014.08.25 10:00 Ozero GBPUSD,M15: #2 종가 0.10 GBPUSD 1.6564, 가격 1.6574
2014.10.31 07:42:31.473 2014.08.25 06:31 오제로 GBPUSD,M15: 주문오픈 2
2014.10.31 07:42:31.473 2014.08.25 06:31 Ozero GBPUSD,M15: 오픈 #2 1.6564 ok에서 0.10 GBPUSD 매수
2014.10.31 07:42:31.473 2014.08.25 06:31 Ozero GBPUSD,M15: 1위 오픈
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: 포지션이 마감되지 않았습니다. 이 쓰레기가 일어나고 있습니다: 4108
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: OrderClose 오류 4108
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: OrderClose 기능에 대한 알 수 없는 티켓 1
2014.10.31 07:42:31.331 2014.08.25 06:30 Ozero GBPUSD,M15: 마감 #1 매수 0.10 GBPUSD 1.6550, 가격 1.6562
2014.10.31 07:41:31.966 2014.08.25 00:00 오제로 GBPUSD,M15: 주문오픈 1
2014.10.31 07:41:31.966 2014.08.25 00:00 Ozero GBPUSD,M15: 오픈 #1 1.6550 ok에서 0.10 GBPUSD 매수
2014.10.31 07:41:31.966 2014.08.25 00:00 Ozero GBPUSD,M15: 첫 포지션 오픈
2014.10.31 07:41:31.958 오제로 입력: gLot=0.1; g포인트=0.001;

이제 완전히 혼란스러워졌습니다. 한편으로는 주문이 마감되고 차트와 "결과"에서 볼 수 있으며 다른 한편으로는 로그로 판단하면 코드가 오류와 함께 실행됩니다. (((((((((((((())

호수.

 
동일한 주문을 두 번 마감하려고 합니다. 상단을 제거합니다.
 
Roger :
동일한 주문을 두 번 마감하려고 합니다. 상단을 제거합니다.
아래쪽이 더 좋습니다. 먼저 주문을 선택해야 합니다.
 
            
//ResetLastError();
//if(!OrderClose(OrderTicket(),OrderLots(),_Bid,15)) Print("Чё-та не закрылася позиция. Фигня вот такая происходит: "+GetLastError());

좋은 아침.

두 줄을 제거했습니다. 모든 것이 작동합니다. 결과와 로그 모두에서 모든 것이 차트에 올바르게 표시됩니다.

질문: 컴파일할 때


'오제로.mq4' 오제로.mq4 1 1
'OrderClose'의 반환 값을 확인해야 합니다. Ozero.mq4 46 13
오류 0개, 경고 1개 1 2



컴파일러는 무엇에 대해 경고합니까? 46행은 OrderClose(OrderTicket(),OrderLots(),_Bid,15)입니다.


호수.

 
tuner :

남자들은 오늘 발생한 결함 때문에 나에게 말합니다.

EA는 금요일 시장이 마감되기 15분 전에 거래를 중단할 수 있습니다.

새로운 날짜가 나타나면 EA가 금요일인지 확인한 다음 StringToTime("23:59")-15*60에서 오늘 거래를 중지합니다.

전략 테스터에서는 이 기능이 올바르게 작동하지만 실제로는 완전히 다른 그림을 봅니다. 금요일이 오면 어드바이저가 첫 번째 틱으로 거래를 중단합니다.

다음은 전문가 잡지의 인쇄물입니다.

브로커 #1, 데모:

0 05:59:47.731 Scalper GBPAUDpt,M1: 금요일에 완료 = 2014.10. 23 23:44:00

브로커 №2, 실제:

0 03:00:11.999 Scalper EURUSD,M1: 금요일 마감 = 2014.10. 23 23:44:00

즉, 첫 번째 눈금에 오늘의 일일 막대가 나타날 때(10월 24일, 금요일), EA

오늘 날짜를 지정하는 대신 문자열 "23:59"를 어제의 시간으로 변환합니다.

그러나 EA가 금요일 정오에 다시 시작되면 작업 완료 시간을 올바르게 결정합니다.

이 문제의 원인을 찾았습니다: https://forum.mql4.com/33023

예상대로 이것은 실제로 StringToTime 함수의 버그입니다. 모든 증상이 수렴됩니다. 이 함수는 문자열 "23:59"를 MT4 날짜가 아닌 로컬 PC 날짜가 있는 날짜/시간으로 변환합니다. 그리고 테스터에서는 아시다시피 로컬 PC의 날짜가 에뮬레이트되어 터미널 시간과 동일합니다. 따라서 테스터에서는 모든 것이 제대로 작동하지만 데모/실제 테스트에서는 결함과 손실이 나타납니다. 물론 문서에는 날짜가 어디에서 왔는지 알려주지 않고 위의 링크는 이 문제가 4년 전에 제기되었음을 보여주지만 분명히 메타따옴표는 신경 쓰지 않습니다.

 
      RefreshRates();                     // Обновим данные
      _Bid=MarketInfo( "GBPUSD" ,MODE_BID);

       if (_Bid>=gPoint1)
        {
           for (pos= OrdersTotal ();pos>= 0 ;pos--)
             {
                OrderClose(OrderTicket()- 1 ,OrderLots(),_Bid, 15 );
             }      
       
        }

질문 하나 더. 나는 다음을 올바르게 이해합니다.

1. 주문 번호는 "0"부터 시작합니다.

2. 이러한 코드는 프로그래밍 방식으로라도 수동으로 열더라도 모든 주문을 절대적으로 닫습니까? 저것들. 프로그램의 이 부분을 닫을 수 없는 주문이 있습니까?


호수.

 

화면에서 텍스트 스크롤을 해본 사람이 있습니까? 예를 들어 - 이런 저런 주문이 열리다 / 닫히다 / 수정되다 등등.. 뉴스 이런 일이... ?

실례가 되지 않는다면 코드를 보여주세요.

센크스!

 
Vinin :
아래쪽이 더 좋습니다. 먼저 주문을 선택해야 합니다.

더 나은 방법:

 //+------------------------------------------------------------------+
//|                                                        Ozero.mq4 |
//|                                            Copyright 2014, Vinin |
//|                                         http://bomzh_inc.ucoz.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, Bomzh Inc"
#property link        "http://bomzh_inc.ucoz.ru"
#property version    "1.00"
#property strict
// -------- переменные --- Н -----
input double gLot= 0.1 ;           // Размер лота для покупки 
input double gPoint= 0.001 ;       // Дельта для закрытия 
input string symbol= "GBPUSD" ;     // Рабочая валютная пара
void OnTick () {
   // Открытие позиции
   if ( OrdersTotal ()== 0 ) {
       int ticket= 0 ;
       double _Ask= SymbolInfoDouble (symbol, SYMBOL_ASK );
       Print ( " Открытие первой позиции " );
      ticket= OrderSend (symbol,OP_BUY,gLot,_Ask, 15 , 0 , 0 );
       if (ticket> 0 ) Print ( "ОТКРЫТ ОРДЕР #" + IntegerToString (ticket));
      }
   //--- Закрытие позиций
   double _Bid= SymbolInfoDouble (symbol, SYMBOL_BID ); //для цены
   for ( int pos= OrdersTotal ()- 1 ;pos>= 0 ;pos--) {
       if ( OrderSelect (pos,SELECT_BY_POS)) {
         if (OrderSymbol()!=symbol) continue ;
         if (OrderType()!=OP_BUY)   continue ;
         if (OrderOpenPrice()+gPoint<_Bid) {
             ResetLastError ();
             if (!OrderClose(OrderTicket(),OrderLots(),_Bid, 15 )) 
               Print ( "Чё-та не закрылася позиция. Фигня вот такая происходит: " + IntegerToString ( GetLastError ()));
            }
         }
      }
   //--- End OnTick()
}
//+------------------------------------------------------------------+
 
_new-rena :

화면에서 텍스트 스크롤을 해본 사람이 있습니까? 예를 들어 - 이런 저런 주문이 열리다 / 닫히다 / 수정되다 등등.. 뉴스 이런 일이... ?

실례가 되지 않는다면 코드를 보여주세요.

센크스!

빈 표시기 창에서 세로 스크롤을 했습니다 . 기능은 다음과 같습니다.

 //+------------------------------------------------------------------+
// Если bool print = true или нет окна индикатора, то функция будет выводить сообщения в журнал
void iPrint( string mess1, int sz= 9 , color color1= clrDarkGray , 
             string mess2= "" , color color2= clrDarkGray , 
             string mess3= "" , color color3= clrDarkGray , 
             string mess4= "" , color color4= clrDarkGray , 
             bool draws= true ) {
   string    NameGrafText, message, nm;
   int       i, y, k, shift, Win_Num=- 1 , num= 0 ;
   color     cl;
   Win_Num=WindowFind( "Win_Inform" );
   if (mess1== "" ) {
       //Print("Func iPrint: Передана пустая строка, выходим");
       return ;
      }
   if (!draws || 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=( int )ObjectGet(NameGrafText, OBJPROP_YDISTANCE );           // старая координата Y
               ObjectSet  (NameGrafText, OBJPROP_YDISTANCE , y+(sz+ 1 )*num); // новая координата Y
               ObjectSet  (NameGrafText, OBJPROP_COLOR , clrDimGray );       // новый цвет
               }
            }
         }
      }
// Вывод новых сообщений
   shift=num;
   uint v= GetTickCount ();
   for (i= 0 ; i<num; i++) {
      shift--;
      NameGrafText=Prefix+ "_GT_" + IntegerToString (i)+ "_" + IntegerToString (v);   // Уникальное имя объекта
       int app= 0 ;
       while ( ObjectFind (NameGrafText)==Win_Num) {   // Если всё-таки такой объект есть
         app++;
         NameGrafText=Prefix+ "_GT_" + IntegerToString (i)+ "_" + IntegerToString (v)+ "_" + IntegerToString (app); // добавим к его имени "хвостик"
         }
      Mass_Name_Message[num- 1 -i]=NameGrafText;
       switch (i) {
         case 0 : message=mess1; cl=color1; break ;
         case 1 : message=mess2; cl=color2; break ;
         case 2 : message=mess3; cl=color3; break ;
         case 3 : message=mess4; cl=color4; break ;
         default :message=mess1; cl=color1; 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();
      }
}
//+------------------------------------------------------------------+

단일 색상 메시지를 사용하는 예(다른 단어에 대해 한 줄에 4가지 색상을 사용할 수 있음):

 if (get.BarOpenLastPos(sy, PERIOD_H4 ,OP_SELL,mn)!= 0 ) {
   string mess1= "На D1 вниз, на H4 ниже SAR, M15 сигнал. Продаём" ;
   iPrint(mess1, 9 , clrBlue );
   trade.OpenS(sy,lots,mn, 0.0 , 0.0 ,co);
   }

차트에는 Win_Inform이라는 빈 표시기가 있어야 합니다.

사유: