MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 59

 
このコードを完成させるために、どうか助けてください。

未決済注文の件数に制限を加えたいのですが。
ファイル:
mjj.txt  21 kb
 
Vadim Podoprigora:
このコードを完成させるために、どうか助けてください。

未決済注文の件数に制限を加えたいのですが。

と、どのようなコードで、どのような後に制限をかけるべきでしょうか?

----------------------------------------------------------------------

ちなみに、どのデータ値で理由を説明できる人は

式 if ((AccountInfoDouble(ACCOUNT_EQUITY)*1.1>=AccountInfoDouble(ACCOUNT_BALANCE)) || (AccountInfoDouble(ACCOUNT_EQUITY)*0.9>=AccountInfoDouble(ACCOUNT_BALANCE))

ふてくされる

大きな揺らぎを抑えるため

最後に一言

ボタン作りの資料を探しています

これらのコードをパネルに統合する必要があります。
 
trader781:

と、どのようなコードで、どのような後に制限をかけるべきでしょうか?

----------------------------------------------------------------------

ちなみに、どのデータ値で理由を説明できる人は

式 if ((AccountInfoDouble(ACCOUNT_EQUITY)*1.1>=AccountInfoDouble(ACCOUNT_BALANCE)) || (AccountInfoDouble(ACCOUNT_EQUITY)*0.9>=AccountInfoDouble(ACCOUNT_BALANCE))

ふてくされる

大きな揺らぎを抑えるため

最後に一言

ボタンの作成に関する資料を探しています。

これらのコードをパネルに統合する必要があります。
記事欄には、そんな資料が満載です。最も簡単な例は、グラフィカル・オブジェクトの各タイプのヘルプ(https://www.mql5.com/ru/docs/constants/objectconstants/enum_object/obj_button)に記載されています。
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_BUTTON
Документация по MQL5: Стандартные константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_BUTTON
  • www.mql5.com
Стандартные константы, перечисления и структуры / Константы объектов / Типы объектов / OBJ_BUTTON - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
trader781:

どのように動作させればよいのか、また、何の後に制限を設ければよいのか?

----------------------------------------------------------------------

ちなみに、どのデータ値で理由を説明できる人は

式 if ((AccountInfoDouble(ACCOUNT_EQUITY)*1.1>=AccountInfoDouble(ACCOUNT_BALANCE)) || (AccountInfoDouble(ACCOUNT_EQUITY)*0.9>=AccountInfoDouble(ACCOUNT_BALANCE))

ふてくされる

大きな揺らぎを抑えるため

最後に一言

ボタン作りの資料を探しています。

これらのコードをパネルにまとめなければなりません。
同時に発注する未決済注文の数を制限することができます。
 
Vadim Podoprigora:
同時に発注する未決済注文の数を制限することができます。
ホールド
ファイル:
55677.mq4  42 kb
 
こんにちは、私は次のように取引するEAを書く 仕事を与えられました:
ユーザーによって指定された期間(例えば、00-00から02-00まで)の価格の最小値と最大値を決定 します。買い:ローソク足で価格が下限を下回った、売り:価格が上限を上回った。オープンポジションの場合、新しい取引は開始されません。指定した時間(これもユーザーが指定、仮に22-00とする)またはSLTP(ユーザーが指定)でポジションを閉じる。


問題は、この時間帯の最小と最大を実際にどのように定義 するかである。また、EAはユーザーが指定した期間(最小値と最大値を検索する場所)が終了する前に取引を開始することはできません。そして、どのように注文数を追跡する(彼らは複数にならないように)?

誰がどこを掘って、それを探すために知っている、事前にありがとう ございました。もし、どなたかコードを教えていただけると助かります。
 
Anarchist:
こんにちは、私は次のように取引するEAを書く 仕事を与えられました:
ユーザーによって指定された期間(例えば、00-00から02-00まで)の価格の最小値と最大値を決定 します。買い:ローソク足で価格が下限を下回った、売り:価格が上限を上回った。オープンポジションの場合、新しい取引は開始されません。指定した時間(これもユーザーが指定、仮に22-00とする)またはSLTP(ユーザーが指定)でポジションを閉じる。


問題は、この時間帯の最小と最大を実際にどのように定義 するかである。また、EAはユーザーが指定した期間(最小値と最大値を検索する場所)が終了する前に取引を開始することはできません。そして、どのように注文数を追跡する(彼らは複数にならないように)?

誰がどこを掘って、それを探すために知っている、事前にありがとう ございました。もし、どなたかコードを教えていただけると助かります。
これはタームペーパーですか?
 
Alexey Viktorov:
これはタームペーパーですか?
これは単純な実験作業で、ここではこれら(ユーザーが指定した)すべてがプログラムの最初にコードで変数として指定されている+ユーザーが愚かでないことを考慮することです。
 
Anarchist :
みなさん、こんにちは。私は次のように取引されるエキスパートアドバイザーを書くタスクを与えられました。
ユーザーが指定した期間(たとえば、00-00から02-00)の最低価格と最高価格を決定します。買い:ろうそくで、価格は安値を超えました、売り:価格は高値を超えました。オープンポジションでは、新規取引は行いません。指定された時間(ユーザーによって指定された、たとえば22-00)またはSL \ TP(ユーザーによって指定された)で位置を閉じます。


問題は、この最小値と最大値を一定期間実際に決定する方法です。さらに、アドバイザーは、ユーザーが指定した時間(最小値と最大値が検索される時間)が終了する前に取引を開始することはできません。そして、注文数を追跡する方法は(複数ないように)?

誰がどこを掘り、どこを見るかを教えてくれます。よろしくお願いします。誰かがコードを手伝ってくれるなら、それは素晴らしいことです。

特別なチェックをせずに、すばやくスケッチしてください。テスターに役立ちます。

//+------------------------------------------------------------------+
//|                                                       test07.mq4 |
//|                                                   Sergey Gritsay |
//|                         https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link        "https://www.mql5.com/ru/users/sergey1294"
#property version    "1.00"
#property strict

input string analysis_time_start= "10:00" ;
input string analysis_time_end= "12:00" ;
input string time_out= "16:00" ;
input string time_out_close= "23:00" ;

input int     shift_open= 0 ;
input int     MagicNumber= 20110315 ;       // Номер копии
input double Lot= 0.01 ;           // Объем лота
input int     StopLoss     = 300 ;             // Стоп Лосс (Пипс)
input int     TakeProfit   = 500 ;             // Тейк Профит (Пипс)
input int     Slippage     = 10 ;             // Проскальзование (Пипс)
input string CommentOrder= "test" ;     // Комментарий к ордеру

double    up_price= 0.0 ;
double down_price= 0.0 ;
double hist_high[];
double hist_low[];
double hist_close[];
MqlDateTime times;
MqlRates rates[];
datetime d1;
datetime d2;
datetime d3;
datetime d4;
bool flag_open= false ;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit ()
  {
//---
   VLineCreate( 0 , "Line_start" );
   VLineCreate( 0 , "Line_end" );
   VLineCreate( 0 , "Line_time_out" );
   VLineCreate( 0 , "Line_time_out_close" );
   HLineCreate( 0 , "Line_max" );
   HLineCreate( 0 , "Line_min" );
//---
   return ( INIT_SUCCEEDED );
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit ( const int reason)
  {
//---
   VLineDelete( 0 , "Line_start" );
   VLineDelete( 0 , "Line_end" );
   VLineDelete( 0 , "Line_time_out" );
   VLineDelete( 0 , "Line_time_out_close" );
   HLineDelete( 0 , "Line_max" );
   HLineDelete( 0 , "Line_min" );
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick ()
  {
//---
   datetime date= TimeCurrent (times);
   int ty=times.year;
   int tm=times.mon;
   int td=times.day;
   d1= StringToTime (( string )ty+ "." +( string )tm+ "." +( string )td+ " " +analysis_time_start);
   d2= StringToTime (( string )ty+ "." +( string )tm+ "." +( string )td+ " " +analysis_time_end);
   d3= StringToTime (( string )ty+ "." +( string )tm+ "." +( string )td+ " " +time_out);
   d4= StringToTime (( string )ty+ "." +( string )tm+ "." +( string )td+ " " +time_out_close);

   if (!flag_open && date>d1 && date<d2)flag_open= true ;
   if (date>=d3 && d2<d3)flag_open= false ;

   if (date>d2)
     {
       if ( CopyLow ( _Symbol , 0 ,d1,d2,hist_low)< 0 ) return ;
       if ( CopyHigh ( _Symbol , 0 ,d1,d2,hist_high)< 0 ) return ;
      up_price= NormalizeDouble (hist_high[ ArrayMaximum (hist_high)], _Digits );
      down_price= NormalizeDouble (hist_low[ ArrayMinimum (hist_low)], _Digits );
     }

   VLineMove( 0 , "Line_start" ,d1);
   VLineMove( 0 , "Line_end" ,d2);
   VLineMove( 0 , "Line_time_out" ,d3);
   VLineMove( 0 , "Line_time_out_close" ,d4);
   HLineMove( 0 , "Line_max" ,up_price);
   HLineMove( 0 , "Line_min" ,down_price);

   Comment (
           "\n date = " ,date,
           "\n d1 = " , TimeToString (d1),
           "\n d2 = " , TimeToString (d2),
           "\n d3 = " , TimeToString (d3),
           "\n d4 = " , TimeToString (d4)
           );

   if (flag_open)
     {
       if (TotalOrder()== 0 )
        {
         if ( CopyRates ( _Symbol , PERIOD_CURRENT , 0 ,shift_open+ 2 ,rates)==shift_open+ 2 )
           {
             if (date>d2 && date<d3 && d2<d3 && rates[shift_open].time>d2)
              {
               if (rates[shift_open].close>=up_price && rates[shift_open+ 1 ].close<=up_price)
                 {
                  OrderOpen( OP_BUY );
                 }

               if (rates[shift_open].close<=down_price && rates[shift_open+ 1 ].close>=down_price)
                 {
                  OrderOpen( OP_SELL );
                 }
              }
           }
        }
     }

   if (date>=d4 && d2<d4)
     {
       OrderClose ();
     }

   ModifySL(StopLoss);
   ModifyTP(TakeProfit);
  }
//+------------------------------------------------------------------+
int TotalOrder()
  {
   int value= 0 ;
   int total= OrdersTotal ();
   for ( int i=total- 1 ; i>= 0 ; i--)
     {
       if (! OrderSelect (i, SELECT_BY_POS )) continue ;
       if ( OrderSymbol ()!= Symbol ()) continue ;
       if ( OrderMagicNumber ()!=MagicNumber) continue ;
       if ( OrderType ()> 1 ) continue ;
      value++;
     }
   return (value);
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OrderOpen( int type)
  {
   double price_open= 0.0 ;
   if (type== WRONG_VALUE ) return ;
   if (! IsTradeAllowed ()) return ;

   if (type== OP_BUY )price_open = NormalizeDouble ( Ask , _Digits );
   if (type== OP_SELL )price_open = NormalizeDouble ( Bid , _Digits );

   int ticket= OrderSend ( _Symbol ,type,Lot,price_open,Slippage, 0 , 0 ,CommentOrder,MagicNumber);
   if (ticket< 0 ) Print ( "Ошибка открытия ордера № - " , GetLastError ());
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void OrderClose ()
  {
   double price_close= 0.0 ;
   if (! IsTradeAllowed ()) return ;
   int total= OrdersTotal ();
   for ( int i=total- 1 ; i>= 0 ; i--)
     {
       if (! OrderSelect (i, SELECT_BY_POS )) continue ;
       if ( OrderMagicNumber ()!=MagicNumber) continue ;
       if ( OrderSymbol ()!= _Symbol ) continue ;
       if ( OrderType ()!= OP_BUY  &&  OrderType ()!= OP_SELL ) continue ;
       if ( OrderType ()== OP_BUY )price_close= NormalizeDouble ( Bid , _Digits );
       if ( OrderType ()== OP_SELL )price_close= NormalizeDouble ( Ask , _Digits );
       bool res= OrderClose ( OrderTicket (), OrderLots (),price_close,Slippage);
       if (!res) Print ( "Ошибка закрытия ордера № - " , GetLastError ());
     }
  }
//+------------------------------------------------------------------+
//|                                                                  |
//+------------------------------------------------------------------+
void ModifySL( double sl)
  {
   if (sl<= 0 ) return ;
   double price_sl= 0.0 ;
   int total= OrdersTotal ();
   for ( int i=total- 1 ; i>= 0 ; i--)
     {
       if (! OrderSelect (i, SELECT_BY_POS )) continue ;
       if ( OrderMagicNumber ()!=MagicNumber) continue ;
       if ( OrderSymbol ()!= _Symbol ) continue ;
       if ( OrderType ()> 1 ) continue ;
       if ( OrderStopLoss ()== 0 )
        {
         if ( OrderType ()== OP_BUY )price_sl= NormalizeDouble ( OrderOpenPrice ()-sl* _Point , _Digits );
         if ( OrderType ()== OP_SELL )price_sl= NormalizeDouble ( OrderOpenPrice ()+sl* _Point , _Digits );
         if (price_sl<= 0 ) continue ;
         bool res= OrderModify ( OrderTicket (), OrderOpenPrice (),price_sl, OrderTakeProfit (), 0 );
         if (!res) Print ( "Ошибка модификации стоп лосса ордера № - " , GetLastError ());
        }
     }
  }
//+------------------------------------------------------------------+
void ModifyTP( double tp)
  {
   if (tp<= 0 ) return ;
   double price_tp= 0.0 ;
   int total= OrdersTotal ();
   for ( int i=total- 1 ; i>= 0 ; i--)
     {
       if (! OrderSelect (i, SELECT_BY_POS )) continue ;
       if ( OrderMagicNumber ()!=MagicNumber) continue ;
       if ( OrderSymbol ()!= _Symbol ) continue ;
       if ( OrderType ()> 1 ) continue ;
       if ( OrderTakeProfit ()== 0 )
        {
         if ( OrderType ()== OP_BUY )price_tp= NormalizeDouble ( OrderOpenPrice ()+tp* _Point , _Digits );
         if ( OrderType ()== OP_SELL )price_tp= NormalizeDouble ( OrderOpenPrice ()-tp* _Point , _Digits );
         if (price_tp<= 0 ) continue ;
         bool res= OrderModify ( OrderTicket (), OrderOpenPrice (), OrderStopLoss (),price_tp, 0 );
         if (!res) Print ( "Ошибка модификации тейк профита ордера № - " , GetLastError ());
        }
     }
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Создает вертикальную линию                                       |
//+------------------------------------------------------------------+
bool VLineCreate( const long             chart_ID= 0 ,         // ID графика
                 const string           name= "VLine" ,       // имя линии
                 const int              sub_window= 0 ,       // номер подокна
                 datetime               time= 0 ,             // время линии
                 const color            clr= clrRed ,         // цвет линии
                 const ENUM_LINE_STYLE style= STYLE_SOLID , // стиль линии
                 const int              width= 1 ,           // толщина линии
                 const bool             back= false ,         // на заднем плане
                 const bool             selection= true ,     // выделить для перемещений
                 const bool             ray= true ,           // продолжение линии вниз
                 const bool             hidden= true ,       // скрыт в списке объектов
                 const long             z_order= 0 )         // приоритет на нажатие мышью
  {
//--- если время линии не задано, то проводим ее через последний бар
   if (!time)
      time= TimeCurrent ();
//--- сбросим значение ошибки
   ResetLastError ();
//--- создадим вертикальную линию
   if (! ObjectCreate (chart_ID,name, OBJ_VLINE ,sub_window,time, 0 ))
     {
       Print ( __FUNCTION__ ,
             ": не удалось создать вертикальную линию! Код ошибки = " , GetLastError ());
       return ( false );
     }
//--- установим цвет линии
   ObjectSetInteger (chart_ID,name, OBJPROP_COLOR ,clr);
//--- установим стиль отображения линии
   ObjectSetInteger (chart_ID,name, OBJPROP_STYLE ,style);
//--- установим толщину линии
   ObjectSetInteger (chart_ID,name, OBJPROP_WIDTH ,width);
//--- отобразим на переднем (false) или заднем (true) плане
   ObjectSetInteger (chart_ID,name, OBJPROP_BACK ,back);
//--- включим (true) или отключим (false) режим перемещения линии мышью
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
   ObjectSetInteger (chart_ID,name, OBJPROP_SELECTABLE ,selection);
   ObjectSetInteger (chart_ID,name, OBJPROP_SELECTED ,selection);
//--- включим (true) или отключим (false) режим отображения линии в подокнах графика
   ObjectSetInteger (chart_ID,name, OBJPROP_RAY ,ray);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
   ObjectSetInteger (chart_ID,name, OBJPROP_HIDDEN ,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
   ObjectSetInteger (chart_ID,name, OBJPROP_ZORDER ,z_order);
//--- успешное выполнение
   return ( true );
  }
//+------------------------------------------------------------------+
//| Перемещение вертикальной линии                                   |
//+------------------------------------------------------------------+
bool VLineMove( const long    chart_ID= 0 ,   // ID графика
               const string name= "VLine" , // имя линии
               datetime      time= 0 )       // время линии
  {
//--- если время линии не задано, то перемещаем ее на последний бар
   if (!time)
      time= TimeCurrent ();
//--- сбросим значение ошибки
   ResetLastError ();
//--- переместим вертикальную линию
   if (! ObjectMove (chart_ID,name, 0 ,time, 0 ))
     {
       Print ( __FUNCTION__ ,
             ": не удалось переместить вертикальную линию! Код ошибки = " , GetLastError ());
       return ( false );
     }
//--- успешное выполнение
   return ( true );
  }
//+------------------------------------------------------------------+
//| Удаляет вертикальную линию                                       |
//+------------------------------------------------------------------+
bool VLineDelete( const long    chart_ID= 0 ,   // ID графика
                 const string name= "VLine" ) // имя линии
  {
//--- сбросим значение ошибки
   ResetLastError ();
//--- удалим вертикальную линию
   if (! ObjectDelete (chart_ID,name))
     {
       Print ( __FUNCTION__ ,
             ": не удалось удалить вертикальную линию! Код ошибки = " , GetLastError ());
       return ( false );
     }
//--- успешное выполнение
   return ( true );
  }
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//| Создает горизонтальную линию                                     |
//+------------------------------------------------------------------+
bool HLineCreate( const long             chart_ID= 0 ,         // ID графика
                 const string           name= "HLine" ,       // имя линии
                 const int              sub_window= 0 ,       // номер подокна
                 double                 price= 0 ,           // цена линии
                 const color            clr= clrRed ,         // цвет линии
                 const ENUM_LINE_STYLE style= STYLE_SOLID , // стиль линии
                 const int              width= 1 ,           // толщина линии
                 const bool             back= false ,         // на заднем плане
                 const bool             selection= true ,     // выделить для перемещений
                 const bool             hidden= true ,       // скрыт в списке объектов
                 const long             z_order= 0 )         // приоритет на нажатие мышью
  {
//--- если цена не задана, то установим ее на уровне текущей цены Bid
   if (!price)
      price= SymbolInfoDouble ( Symbol (), SYMBOL_BID );
//--- сбросим значение ошибки
   ResetLastError ();
//--- создадим горизонтальную линию
   if (! ObjectCreate (chart_ID,name, OBJ_HLINE ,sub_window, 0 ,price))
     {
       Print ( __FUNCTION__ ,
             ": не удалось создать горизонтальную линию! Код ошибки = " , GetLastError ());
       return ( false );
     }
//--- установим цвет линии
   ObjectSetInteger (chart_ID,name, OBJPROP_COLOR ,clr);
//--- установим стиль отображения линии
   ObjectSetInteger (chart_ID,name, OBJPROP_STYLE ,style);
//--- установим толщину линии
   ObjectSetInteger (chart_ID,name, OBJPROP_WIDTH ,width);
//--- отобразим на переднем (false) или заднем (true) плане
   ObjectSetInteger (chart_ID,name, OBJPROP_BACK ,back);
//--- включим (true) или отключим (false) режим перемещения линии мышью
//--- при создании графического объекта функцией ObjectCreate, по умолчанию объект
//--- нельзя выделить и перемещать. Внутри же этого метода параметр selection
//--- по умолчанию равен true, что позволяет выделять и перемещать этот объект
   ObjectSetInteger (chart_ID,name, OBJPROP_SELECTABLE ,selection);
   ObjectSetInteger (chart_ID,name, OBJPROP_SELECTED ,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов
   ObjectSetInteger (chart_ID,name, OBJPROP_HIDDEN ,hidden);
//--- установим приоритет на получение события нажатия мыши на графике
   ObjectSetInteger (chart_ID,name, OBJPROP_ZORDER ,z_order);
//--- успешное выполнение
   return ( true );
  }
//+------------------------------------------------------------------+
//| Перемещение горизонтальной линии                                 |
//+------------------------------------------------------------------+
bool HLineMove( const long    chart_ID= 0 ,   // ID графика
               const string name= "HLine" , // имя линии
               double        price= 0 )       // цена линии
  {
//--- если цена линии не задана, то перемещаем ее на уровень текущей цены Bid
   if (!price)
      price= SymbolInfoDouble ( Symbol (), SYMBOL_BID );
//--- сбросим значение ошибки
   ResetLastError ();
//--- переместим горизонтальную линию
   if (! ObjectMove (chart_ID,name, 0 , 0 ,price))
     {
       Print ( __FUNCTION__ ,
             ": не удалось переместить горизонтальную линию! Код ошибки = " , GetLastError ());
       return ( false );
     }
//--- успешное выполнение
   return ( true );
  }
//+------------------------------------------------------------------+
//| Удаляет горизонтальную линию                                     |
//+------------------------------------------------------------------+
bool HLineDelete( const long    chart_ID= 0 ,   // ID графика
                 const string name= "HLine" ) // имя линии
  {
//--- сбросим значение ошибки
   ResetLastError ();
//--- удалим горизонтальную линию
   if (! ObjectDelete (chart_ID,name))
     {
       Print ( __FUNCTION__ ,
             ": не удалось удалить горизонтальную линию! Код ошибки = " , GetLastError ());
       return ( false );
     }
//--- успешное выполнение
   return ( true );
  }

//+------------------------------------------------------------------+

..。

ファイル:
test07.mq4  34 kb
 
注文の締めブロックにバグがありましたので、修正しました。