初心者の方からの質問 MQL4 MT4 MetaTrader 4 - ページ 85

 
deathmond1990:
こんにちは。ある取引期間(つまりローソク足1本分)のティックの値(対応する価格)を1次元配列に読み込むことができるかということです。そして、ローソク足の形成中に配列が形成されるように行うこと。MQL4では現実的なのでしょうか?ご意見をお聞かせください。


それは現実です。ダイナミックな配列で GO。

//-----------------------+
int k=0;       //на глобальном уровне
double тики[];
//----------------
void OnTick()
  {
   ArrayResize(тики,k+1);
   тики[k]=Bid;
   k++;
  }
//+------------------------
 
Alekseu Fedotov:


現実的に考えてダイナミックな配列で、すぐに使える。

ありがとうございました =)
 
皆さん、こんにちは。洪水みたいで嫌なんですが、この機能がないとやっていけないんです。そこで、どなたかこの関数について教えてください。この関数は、すべての注文を調べ、同時に2つの注文を削除します。最も小さいロットとマイナスの利益を持つ注文と、最も大きいロットとプラスの利益を持つ注文を削除します。
 
Arseniy Barudkin:
皆さん、こんにちは。洪水みたいで嫌なんですが、この機能がないとやっていけないんです。そこで、どなたかこの関数について教えてください。この関数は、すべての注文を調べ、同時に2つの注文を削除します。最も小さいロットとマイナスの利益を持つ注文と、最も大きいロットとプラスの利益を持つ注文を、既存の注文からも削除します。

OrderCloseByで 検索してみてください。
 

通常時、異常時に端末を閉じても、すべてのグローバル変数のデータを保存するようにするにはどうしたらよいですか?

質問は、次のようなコードの先頭で宣言された変数に関するものです。

#property copyright "Copyright 2015, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern double  VAR1 = 1;

double VAR2[1000];

VAR1 と VAR2 の値を失わないようにする必要があります(Expert Advisor の動作中に配列はデータで満たされます)。今のところ、tick毎にファイル(global.txt)にデータを書き込み、ターミナル起動 時にファイル(global.txt)から読み込んで変数を再作成し、tick毎に再度書き込むというアイデアしかありません。他にどのような選択肢があるのでしょうか?

 
smart_man:

通常モード、異常モードでクライアント端末を閉じた後でも、すべてのグローバル変数のデータを保持するようにするにはどうすればよいですか?

質問は、このように宣言された変数に関するものです。

extern double  VAR1 = 1;

double VAR2[1000];

VAR1 と VAR2 の値を失わないようにする必要があります(Expert Advisor の動作中に配列はデータで満たされます)。今のところ、tick毎にファイル(global.txt)にデータを書き込み、ターミナル起動 時にファイル(global.txt)から読み込んで変数を再作成し、tick毎に再度書き込むというアイデアしかありません。他にどんなバリエーションがあるのでしょうか?

オプション

クライアント端末のグローバル変数

//--------

グローバルに宣言された変数と混同しないように

 
fxtz:

質問 メタトレーダー4で、2ポジションから250ポジションまで、設定したストップロスや利益をワンクリックでオープンするプログラムを書く ことができますか?手動で開く必要はない


1つの商品に対して、これだけの注文を出せる証券会社は見つかりましたか?通常、100件の注文はすべての商品で制限されています...。

そうそう、100個も開けられるんですよ。

 
Alekseu Fedotov:

OrderCloseByで 検索してみてください。

ありがとうございました。しかし、私はこれらの注文のチケットを少なくとも3つの注文から選択しなければならず、しばしば5から10の注文までより多く存在します。

 
Arseniy Barudkin: 注文のテロップを選択するのは当然として、なぜその注文のロットと利益を別々に計算して比較する必要があるのでしょうか。

状況は、あなたが想像しているよりもずっと悪いのです。OrderSelect()で 選択された1つの注文のみが、その時点で利用可能です。そして、一番最初のオーダーが決まったとき、何と比較すればいいのか。賢い人は本当にこんなことをするんだ

double МинПрофит=1000000, МаксПрофит=-1000000;
int МаксТикет=0, МинТикет=0;
for(int Номер=OrdersTotal-1; Номер>=0; Номер--)
{
   if(!OrderSelect(Номер,SELECT_BY_POS)) continue;
   if(OrderProfit()>МаксПрофит)
   {
      МаксТикет=OrderTicket();
      МаксПрофит=OrderProfit();
   }
   else if(OrderProfit()<МинПрофит)
   {
      МинТикет=OrderTicket();
      МинПрофит=OrderProfit();
   }
 }
そして、見つかったチケットの価値を見てみると......いきなりゼロ!!。
 
STARIJ:

状況は、あなたが想像しているよりもずっと悪いのです。OrderSelect()で 選択された1つの注文のみが、その時点で利用可能です。そして、一番最初のオーダーが決まったとき、何と比較すればいいのか。賢い人は本当にこんなことをするんだ

そして、見つかったチケットの価値を見てください。突然、ゼロになりました!

ありがとうございました。今まではこのままにしておいたのですが、今度は関数が呼ばれる条件を少し変えてみることにしました。そして、総じて、あなたにはとても助けられています))
void MarginDefuse(double lot1=0,double lot2=0)
{
 int ticket1=0,ticket2=0,type=-1;
 double profit1=0,profit2=0;
 bool res1=false,res2=false;
 // Выделение
 for(int i=0; i<OrdersTotal(); i++)
 {
  if(!OrderSelect(i,SELECT_BY_POS)) continue; // Что-то помешало - идем к следующему
  if(OrderSymbol() != Symbol()) continue;          // Чужой график
  if(OrderType()<2 && OrderMagicNumber() == Magic)
  {
   if(OrderLots()>=lot1 && OrderProfit()<0)
   {
    ticket1=OrderTicket();
    lot1=OrderLots();
    type=OrderType();
    profit1=OrderProfit();
   }
  }
 }
 for(int i=OrdersTotal()-1; i>=0; i--)
 {
  if(!OrderSelect(i,SELECT_BY_POS)) continue; // Что-то помешало - идем к следующему
  if(OrderSymbol() != Symbol()) continue;          // Чужой график
  if(OrderType() != type && OrderType()<2 && OrderMagicNumber() == Magic)
  {
   if(OrderLots() >= lot2/Multipler && OrderProfit()>0 && OrderLots()>lot1)
   {
    ticket2 = OrderTicket();
    lot2 = OrderLots();
    profit2=OrderProfit();
   }
  }
 }
 if((profit1+profit2)>0 && lot1<lot2)
 {
  while (!RefreshRates());
  if(ticket1)
  {
   if(OrderSelect(ticket1,SELECT_BY_TICKET))
   res1=OrderCloseX(ticket1,lot1);
  }
  if(ticket2)
  {
   if(OrderSelect(ticket2,SELECT_BY_TICKET))
   res2=OrderCloseX(ticket2,lot2);
  }
  if(res1 && res2)
   DeletePos();
 }
}