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

 
Seric29:

0〜4要素にdouble、5〜9要素にdatetame、10〜14要素にintを格納する1次元配列を作成したい。mql4で整理することは可能でしょうか? もし可能なら、方法を教えてください。C++で構造体を使った例を見たことがありますが、サイトへのリンクを失念しています?

型ごとに特定の配列セルを割り当てている場合は、配列ではなく構造体を作る。

 
Koldun Zloy:

型ごとに特定の配列セルを割り当てている場合は、配列ではなく構造体を作る。

残念ながら、彼はタスクを正式に決定することもできない。

一方では、彼はC++ / MQLの厳密な型付けから逃れたいようです。これは良い議論スレッドですが、私はそれが彼の助けになるとは思いませんけどhttps://www.mql5.com/ru/forum/294094

この議論の過程で(もう3ヶ月くらい続いているかな)、@Seric29 は関数シグネチャの記述から離れ、任意の数のパラメータを受け取る「幻の」関数を 取得する必要があることが判明しました。

そして、多次元の動的配列がこのすべてに関与していることが議論の過程で判明し、これらの配列はパラメータとして関数に渡される必要があります。

すなわち、これは形式化されていないタスクであり、その解決策は常に「現場からの叫び」で終わる、開発者は何かの機能を減らし、私にループ演算子のソースコードを与え、私はそれらをやり直し、その後、後者です。

Seric29 です。
mql4の開発者に手紙を書く方法コンパイラのコードを見る方法、もっと機能を追加して静的でないようにする方法はないですか?

...そんなもんだというフレーズは、少なくとも「mind blowing」と言えるでしょう ))))

 

だから、詳細は明かさないんです。

基本を学ぶことからは逃れられない。

 
Koldun Zloy:

基本を学ぶことからは逃れられない。

男は基本を学ばず、もう全部知っていることを示そうとするのが面白いし、お前 らはメタクソに仕事を邪魔している)

 
Taras Slobodyanik:

この人は基本的なことを学んでいるのではなく、もう全部知っているということを示そうとしているのが面白いし、君たちは その人が仕事をするのを邪魔しているメタクォートだ)

ごあいさつExpert Advisor Video「MQL4からMQL5へ - Metatrader 5用のEAを書き換える方法」を拝見させていただきました。
著者に感謝します。自分でもやってみようと思いました。自分でもやってみようと思ったんです。考え方は次のとおりです。
1.入力-買いが開くでdtriger = 1としました。
2.dtriger = -1 - Sell opensに設定しました。
3.マルチプラグのdtriger=0を設定したところ、開いているものは全て閉じてしまいました。
FAQにMT5では反対方向のポジションを持つことができないと書いてありましたが、本当ですか?
と持っています。
質問:オープンポジションのクローズを正しく処方するには?
問題は、矢印の開始(反転)で既存のポジションの閉鎖を正しく登録するにはどうすればよいか、ということです。
ありがとうございました。

#include <TradePositionInfo.mqh>.
#include <TradeTrade.mqh>
#include <TradeSymbolInfo.mqh>.
#include <TradeOrderInfo.mqh>

CPositionInfo o_position;
CTrade o_trade;
CSymbolInfo o_symbol;
COrderInfo o_order;

入力 int triger = 0;
input double StartLot = 0.01;
input double lpos_volume = 1.0;
入力 int Step = 10;
input int MagicNumber = 12345; // マジックヌーバー
input int Slippage = 30; // スリッページ

int dtriger;
int dStep

//+------------------------------------------------------------------+
//| エキスパート初期化機能|
//+------------------------------------------------------------------+
int OnInit()
{
dStep = Step ;
dtriger = triger ;

if (!o_symbol.Name(Symbol()))
return(INIT_FAILED);

RefreshRates()。

o_trade.SetExpertMagicNumber(MagicNumber) ;

if (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_FOK))
{
o_trade.SetTypeFilling(ORDER_FILLING_FOK)を実行します。
}
else if (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_IOC))
{
o_trade.SetTypeFilling(ORDER_FILLING_IOC)を実行します。
}
さもなくば
{
o_trade.SetTypeFilling(ORDER_FILLING_RETURN)を実行。
}
o_trade.SetDeviationInPoints(Slippage)を実行します。

if (o_symbol.Digits() == 3 || o_symbol.Digits() == 5 )
{
dStep = 10 ;
}

return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| 専門家による初期化機能|
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
}
//+------------------------------------------------------------------+
//| エキスパートティック機能|
//+------------------------------------------------------------------+
void OnTick()
{
時分lpos_time = 0;
double lpos_price_open = 0.0;
ENUM_POSITION_TYPE lpos_type = -1;
イントpos_count = 0;
double sum_profit = 0;

for (int i = PositionTotal() - 1; i>=0; i--)
{
if (o_position.SelectByIndex(i))
{
if (o_position.Symbol() == o_symbol.Name() && o_position.Magic() == MagicNumber)
{
if (o_position.Time() > lpos_time)
{
lpos_time = o_position.Time(); //OrderOpenTime()。
lpos_price_open = o_position.PriceOpen(); //OrderOpenPrice()です。
lpos_type = o_position.PositionType() ; //OrderTipe();
}

pos_count++;
sum_profit = sum_profit + o_position.Commission() + o_position.Swap() + o_position.Profit() ;
}
}
}

// 保留注文の件数を数える
int stop_count=0;

for (int i=OrdersTotal()-1; i >=0; i--)
{
if (o_order.SelectByIndex(i))
{
if (o_order.Symbol() == o_symbol.Name() && o_order.Magic() == MagicNumber)
stop_count++;
}
}

if (!RefreshRates())
を返す。

if(dtriger == 0 )
{
CloseAll()。
を返します。
}

// + ----- 最初の注文を開ける ++++++++.
if (pos_count == 0 && stop_count == 0 )
{
if ( dtriger == -1 && lpos_type != POSITION_TYPE_SELL)
{
o_trade.Sell(StartLot * lpos_volume , o_symbol.Name()); // S E L L 11111
}

if ( dtriger == 1 && lpos_type != POSITION_TYPE_BUY )
{
o_trade.Buy(StartLot * lpos_volume , o_symbol.Name()); // B U Y 11111
}
}


// + ----- 逆 +++++++++++++++++++++++++ +

if (pos_count>0)
{
if(lpos_type == POSITION_TYPE_BUY )
{
if ( dtriger == -1 )
{
o_trade.Sell(StartLot * lpos_volume , o_symbol.Name()); // S E L L +++++。
}
}

if (lpos_type==POSITION_TYPE_SELL )
{
if ( dtriger == 1 )
{
o_trade.Buy(StartLot * lpos_volume , o_symbol.Name()); // B U Y +++++.
}
}
}


if(pos_count>0 && stop_count>0)
DeleteStopOrders() ;

}
//-----------------------------------------------------------
ブール RefreshRates()
{
if (!o_symbol.RefreshRates())
return(false) ;

if (o_symbol.Ask() == 0 || o_symbol.Bid() == 0)
return(false)です。

return(true)です。
}
//--- ---------------------------------------------------------
bool IsFillingTypeAllowed (string symbol, int fill_type)
{
int filling = (int)SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE);

return((filling && fill_type) == fill_type) ;
}

// --------------------------------------------------
void CloseAll()
{
for (int index = PositionTotal()-1; index >=0; index--)
{
if (o_position.SelectByIndex(index))
{
if (o_position.Symbol() == o_symbol.Name() && o_position.Magic() == MagicNumber)
{
o_trade.PositionClose(o_position.Ticket())を実行します。
}
}
}
}

//-----------------------------------------------------------
// 保留注文をすべて削除する
//-------------------------------------
void DeleteStopOrders()
{
for (int i = OrdersTotal() - 1; i >= 0; i-- )
{
if (o_order.SelectByIndex(i))
if(o_order.Symbol() == o_symbol.Name() && o_order.Magic() == MagicNumber)
o_trade.OrderDelete(o_order.Ticket())を実行します。
}
}

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

 
procom:

ごあいさつ...

コードを正しく挿入してください。


 
Artyom Trishkin:

コードを正しく挿入してください。


大丈夫
#include <Trade\PositionInfo.mqh>
#include <Trade\Trade.mqh>
#include <Trade\SymbolInfo.mqh>
#include <Trade\OrderInfo.mqh>

CPositionInfo   o_position;
CTrade        o_trade;
CSymbolInfo        o_symbol;
COrderInfo         o_order;

input int          triger            = 0;
input double    StartLot             = 0.01;
input double    lpos_volume       = 1.0;
input int          Step         = 10;
input int          MagicNumber    = 12345;      //      Magic   nuaber
input int          Slippage          = 30;         //   slippage

int dtriger;
int dStep;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
   dStep = Step ;
   dtriger = triger ;

   if (!o_symbol.Name(Symbol()))
     return(INIT_FAILED);
   
   RefreshRates();
   
   o_trade.SetExpertMagicNumber(MagicNumber) ;

   if (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_FOK))
   { 
      o_trade.SetTypeFilling(ORDER_FILLING_FOK);
   }
   else if (IsFillingTypeAllowed(o_symbol.Name(), SYMBOL_FILLING_IOC))
   { 
      o_trade.SetTypeFilling(ORDER_FILLING_IOC);
   }
   else 
   {
      o_trade.SetTypeFilling(ORDER_FILLING_RETURN);
   }
      o_trade.SetDeviationInPoints(Slippage);
   
   if (o_symbol.Digits() == 3 || o_symbol.Digits() == 5 )
   {
      dStep = 10 ;
   }
   
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
      datetime              lpos_time          =        0;
      double                lpos_price_open    =        0.0;
      ENUM_POSITION_TYPE   lpos_type           =        -1;
      int                      pos_count               =        0;
      double                sum_profit         = 0;
 
   for (int i = PositionsTotal() - 1; i>=0; i--)
   {
      if (o_position.SelectByIndex(i))
      {
         if (o_position.Symbol() == o_symbol.Name() && o_position.Magic() == MagicNumber)
         {
            if (o_position.Time() > lpos_time)
            {  
               lpos_time       = o_position.Time();            //OrderOpenTime();
               lpos_price_open = o_position.PriceOpen();       //OrderOpenPrice();
               lpos_type       = o_position.PositionType() ;   //OrderTipe();
             }  
            
            pos_count++;
            sum_profit = sum_profit + o_position.Commission() + o_position.Swap() + o_position.Profit() ;
          }     
       }     
    }          

   // Считаем кол-во отложенных ордеров
  int stop_count=0;

   for (int i=OrdersTotal()-1; i >=0; i--) 
   {
      if (o_order.SelectByIndex(i)) 
      {
         if (o_order.Symbol() == o_symbol.Name() && o_order.Magic() == MagicNumber) 
           stop_count++;
      }
   }

   if (!RefreshRates())
     return ;
     
   if(dtriger == 0 )
   {
      CloseAll();
      return;               
   } 
   
  // + -----    Откраваем Первый ордер   ++++++++++
 if (pos_count == 0  && stop_count == 0    )
   {
      if ( dtriger == -1 &&  lpos_type != POSITION_TYPE_SELL)
      {
         o_trade.Sell(StartLot * lpos_volume , o_symbol.Name());  //   S E L L   11111
      }
      
      if ( dtriger == 1 &&  lpos_type != POSITION_TYPE_BUY )
      {
         o_trade.Buy(StartLot * lpos_volume , o_symbol.Name());   //   B U Y    11111
      }
   }
                          

// +  -----   Переворот    ++++++++++++++++++++++++++++   

if (pos_count>0)
   {
      if(lpos_type == POSITION_TYPE_BUY )
      {
         if ( dtriger == -1 )
         {
         o_trade.Sell(StartLot * lpos_volume , o_symbol.Name());   //   S E L L   +++++
         }
      }

      if (lpos_type==POSITION_TYPE_SELL )
      {
         if ( dtriger == 1 )
         {
         o_trade.Buy(StartLot * lpos_volume , o_symbol.Name());       //   B U Y    +++++
         }
      }
   }


   if(pos_count>0 && stop_count>0) 
     DeleteStopOrders() ;
  
} 
//-----------------------------------------------------------
bool RefreshRates()
{
   if (!o_symbol.RefreshRates())
     return(false) ;
     
    if (o_symbol.Ask() == 0 || o_symbol.Bid() == 0)
      return(false);
      
    return(true);
}  
//---  --------------------------------------------------------- 
 bool IsFillingTypeAllowed (string symbol, int fill_type)
{ 
   int filling = (int)SymbolInfoInteger(symbol, SYMBOL_FILLING_MODE); 
 
   return((filling && fill_type) == fill_type) ;
} 
 
 //  -------------------------------------------------- 
   void CloseAll()
{
   for (int index = PositionsTotal()-1; index >=0; index--)
   {
      if (o_position.SelectByIndex(index))
      {
         if (o_position.Symbol() == o_symbol.Name() && o_position.Magic() == MagicNumber)
         {
            o_trade.PositionClose(o_position.Ticket());
         }
      }  
    } 
 } 
  
 //----------------------------------------------------------- 
 // Delete all pending orders
 //-------------------------------------
 void DeleteStopOrders()
 {
    for (int i = OrdersTotal() - 1; i >= 0; i-- ) 
   {
      if (o_order.SelectByIndex(i))
         if(o_order.Symbol() == o_symbol.Name() && o_order.Magic() == MagicNumber)
            o_trade.OrderDelete(o_order.Ticket());
   }
 } 
 
//+------------------------------------------------------------------+
ファイル:
Stend_t1.mq5  12 kb
 
Igor Makanu:

あなたの質問は、少なくともC++の本を読んでください、あなたは専門用語を書き、一見、あなたが特定の質問をしているように見えますが、実際には本質を理解せずに用語で操作するだけです・・・マクロは何を返すのか、どこに返すのか、マクロの本体にはリロード可能な関数があります・・・。ご質問の内容がどのようなものか、説明しきれないほどです。

マクロが何であるかを理解するために、用語を正しく綴り、macroSETTING 、多分それはあなたにとってより簡単に理解することができます。

mql4では、機能やC++が削減され、言い換えれば、あまりにも静的な言語になっています。私のアイデアは失敗したと言えるでしょう、クラスなしで単純なオーバーロードを書き、引数を追加して0を与え、マクロで呼び出そうとしたら、関数が3つあるというエラーが出ました、それで、どれをどのように呼び出すかをまだ記述する必要があると判明しました、後でどんな躓きがあるかは言いません。たぶん、何もしない方が間違いがないと思います。

 
Seric29:

mql4は機能削減とC++、つまりは静的すぎる言語です。

具体的には何が削られたのでしょうか?

つまり、特にgoogleも知らない 静的すぎる 言語」、C++は静的型付け言語であり、それを考えることは意味がない、ただそれだけのことなのです。

Seric29 です。

たぶん、何もしない方が間違いがないと思います。

RTFM ( lurkmore ) を簡単に説明します。

 

純粋に美意識の問題です。

ここに自前の写真があるようにするには?エムティーフォー