MQL4 및 MQL5에 대한 초보자 질문, 알고리즘 및 코드에 대한 도움말 및 토론 - 페이지 500

 
Konstantin Seredkin :

거래를 예로 들자면, 이 버튼에서 시작하는 것이 나쁘지 않은 다른 알고리즘이 많이 있습니다. 스프레드가 확대되고, 버튼이 눌려지고, 로봇이 중지되었거나 거래되었다는 SMS가 전화로 왔습니다. 4개의 로봇 계정에서 5번째는 계정 마진을 제어하고 마진이 설정 값으로 떨어지면 자동 거래를 중단하고 모든 로봇이 발을 빨고 내가 와서 어디에서 하락이 일어나는지 볼 때까지 ... 그러나 차트에서 로봇을 제거하는 것은 참새 총입니다... 버튼은 주어진 알고리즘에 따라 모든 로봇을 절단할 수 있는 포괄적인 솔루션입니다.

어딘가에서 mql5에 대한 솔루션을 보았지만 찾을 수 없습니다.

내가 말했듯이 이것은 급진적인 결정입니다. 올바른 결정은 고문의 코드를 변경하여 특정 상황의 경우 거래 행동 및 이와 관련된 모든 것을 수행하지 않도록 하는 것입니다. 예를 들어, 스프레드 제어는 기본입니다.

 void OnTick ()
{
     double fPoint = Point ();
     if (fPoint <= 0.0 )
       return ;

     int nSpread = int ( MathRound (( Ask - Bid ) / fPoint));
     if (nSpread > 50 )
       return ;

   ... Действия советника при нормальном спреде
}
 

음, Ctrl+E를 누르는 것을 에뮬레이트하여 Autotrade 버튼을 누르거나 누르지 않을 수 있습니다. 그러나 내가 말했듯이 이것은 이미 WinAPI를 사용하고 있습니다.

 #include <WinUser32.mqh>

#define VK_CONTROL 0x11 
#define KEY_CODE   'E'


void PressOrReleaseAutotrade()
{
   keybd_event(VK_CONTROL, 0 , 0 , 0 );
   keybd_event(KEY_CODE, 0 , 0 , 0 );
   keybd_event(KEY_CODE, 0 , 2 , 0 );
   keybd_event(VK_CONTROL, 0 , 2 , 0 );   
}
 
Ihor Herasko :

음, Ctrl+E를 누르는 것을 에뮬레이션하여 Autotrade 버튼을 누르거나 누르지 않을 수 있습니다. 그러나 내가 말했듯이 이것은 이미 WinAPI를 사용하고 있습니다.

감사합니다! 그리고 어떻게 웃는 얼굴을 슬프게 만들 수 있습니까?)

 
Ihor Herasko :

음, Ctrl+E를 누르는 것을 에뮬레이트하여 Autotrade 버튼을 누르거나 누르지 않을 수 있습니다. 그러나 내가 말했듯이 이것은 이미 WinAPI를 사용하고 있습니다.

맞습니다. 하지만 팬케이크는 고통스러울 정도로 간단한 방법이라고 생각하지만 이 라이브러리를 완전히 잊어버렸습니다. 고마워, 이제 우리는 우리가 원하는 것을 할거야

 

직사각형(아래 그림)을 그리는 MQL4 스크립트(아래 코드)를 만들었지만 그것은 작업이 아닙니다. 파선 STYLE_DOT의 경우 너비 1만 작동하고 2 이상은 실선을 그립니다. 내 실수가 어디 있는지 말해줘 아니면 그들이 우리에게 뭔가를 숨기고 있는 걸까?

 #property strict
void OnStart ()
  {
//---
   RectCreate( "rect1" , Time [ 1 ], Low [ 1 ], Time [ 10 ], High [ 10 ], clrYellow , STYLE_DOT ,   1 ,   false );
   RectCreate( "rect2" , Time [ 11 ], Low [ 11 ], Time [ 20 ], High [ 20 ], clrRed , STYLE_DOT ,   2 ,   false );
//---
   Sleep ( 20 * 1000 );
   ObjectsDeleteAll ( 0 );
  }
//--- Function creates rectangle
void RectCreate( const string            f_name,     // rectangle name
                 datetime                f_time1,     // first point time
                 double                  f_price1,   // first point price
                 datetime                f_time2,     // second point time
                 double                  f_price2,   // second point price
                 const color             f_color,     // rectangle color
                 const ENUM_LINE_STYLE   f_style,     // style of rectangle lines
                 const int               f_width,     // width of rectangle lines
                 const bool              f_fill)     // filling rectangle with color

  {
   if ( ObjectCreate ( 0 ,f_name, OBJ_RECTANGLE , 0 ,f_time1,f_price1,f_time2,f_price2))
     {
       ObjectSetInteger ( 0 ,f_name, OBJPROP_COLOR ,f_color);
       ObjectSetInteger ( 0 ,f_name, OBJPROP_STYLE ,f_style);
       ObjectSetInteger ( 0 ,f_name, OBJPROP_WIDTH ,f_width);
       ObjectSetInteger ( 0 ,f_name, OBJPROP_FILL ,f_fill);
       ObjectSetInteger ( 0 ,f_name, OBJPROP_BACK , false );
       ObjectSetInteger ( 0 ,f_name, OBJPROP_SELECTABLE , false );
       ObjectSetInteger ( 0 ,f_name, OBJPROP_SELECTED , false );
     }
  }

 
Maxim Khrolenko :

직사각형(아래 그림)을 그리는 MQL4 스크립트(아래 코드)를 만들었지만 그것은 작업이 아닙니다. 파선 STYLE_DOT의 경우 너비 1만 작동하고 2 이상은 실선을 그립니다. 내 실수가 어디 있는지 말해줘 아니면 그들이 우리에게 뭔가를 숨기고 있는 걸까?

스타일과 두께를 수동으로 그리고 변경해 보셨나요? 그리고 이러한 실험에서 어떤 결론을 얻을 수 있습니까?
 
Artyom Trishkin :
스타일과 두께를 수동으로 그리고 변경해 보셨나요? 그리고 이러한 실험에서 어떤 결론을 얻을 수 있습니까?

답을 찾았습니다. 여기 에서는 "선 스타일. 선 너비가 0 또는 1일 때만 사용됩니다"라고 말합니다. 분명히 여기에 2 이상의 두께로 실선을 제외한 다른 선이 작동하지 않는 이유가 있습니다.

 
Maxim Khrolenko :

답을 찾았습니다. "선 스타일. 선가중치가 0 또는 1일 때만 사용합니다."라고 표시됩니다. 분명히 여기에 2 이상의 두께로 실선을 제외한 다른 선이 작동하지 않는 이유가 있습니다.

맞아요. 이 갈퀴도 밟았다.

 

여러분, 제가 Kim 에서 마지막 위치의 시작 막대 번호 또는 -1을 반환하는 함수를 가져왔습니다.

 int NumberOfBarOpenLastPos( string sym= "" , int tf= 0 , int op=- 1 , int mn=- 1 )
  {
   datetime oot;
   int       i,k= OrdersTotal ();

   if (sym== "" ) sym= Symbol ();
   for (i= 0 ; i<k; i++)
     {
       if ( OrderSelect (i, SELECT_BY_POS , MODE_TRADES ))
        {
         if ( OrderSymbol ()==sym)
           {
             if ( OrderType ()== OP_BUY || OrderType ()== OP_SELL || OrderType ()== OP_BUYLIMIT || OrderType ()== OP_SELLLIMIT )
              {
               if (op< 0 || OrderType ()==op)
                 {
                   if (mn< 0 || OrderMagicNumber ()==mn)
                    {
                     if (oot< OrderOpenTime ()) oot= OrderOpenTime ();
                    }
                 }
              }
           }
        }
     }
   return ( iBarShift (sym, tf, oot, True ));
  }

이 함수를 호출하고 조건을 작성했습니다.

 if ( Open [ 2 ]> Close [ 2 ] && Open [ 1 ]> Close [ 1 ] && Close [ 1 ]< Low [ 2 ])
     {

       Comment ( "цена входа = " , DoubleToStr ( Low [ 2 ], Digits ));
       if (NumberOfBarOpenLastPos( "" , 0 ,- 1 ,- 1 )!= 0 ) //вызвал здесь

         ticket= OrderSend ( Symbol (), OP_SELLLIMIT , 0.1 , Low [ 2 ], 2 , 0 , 0 ,magic, 0 );
       if ( OrderSelect (ticket, SELECT_BY_TICKET , MODE_TRADES ))

         TP= NormalizeDouble ( OrderOpenPrice ()-tp* Point , Digits );
      SL= NormalizeDouble ( OrderOpenPrice ()+sl* Point , Digits );
      modify= OrderModify (ticket, OrderOpenPrice (),SL,TP, 0 );
      }

결과적으로 하나의 주문이 열리지만 막대에서 스톱이 맞고 포즈를 입력하기위한 위의 조건이 어쨌든 저장되면이 막대에서 거래가 열리고 Print 를 통해 함수가 -1을 반환하는 것을 보았습니다. , 처음에는 주문이 전혀 없었기 때문에 나는 주문이 나타났고 모두 동일하고 정류장 후 같은 바에서 거래가 열립니다. 도와주세요. 내가 무엇을 잘못 했습니까?

 
안녕하세요. MT4 및 MT5에서 동일한 장비의 차트를 다른 기간으로 오버레이할 수 있습니까? 뿐만 아니라 이러한 기간에 대한 지표도 오버레이할 수 있습니까? 예를 들어, 한 창에서 EUR/USD 쌍 의 차트 3개를 요일, 4시간 및 시간 프레임으로 표시하고 이러한 데이터에서 이동하는 시간 프레임을 오버레이하려고 합니다. 그게 가능한가요? 어떤 도움이 된다면 기쁠 것입니다.