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

 
datetime some_time=TimeCurrent();
//extern string Symbol3 = ""; //Инструмент (""текущий по умолчанию)
extern int P=1;          //Таймфрейм
extern int MagicNumber = 100500;  // Установили магик


int start()
{

int send;
                                     
double SL=200;                                   
double TP=200;                       
double Lots=1;       

for(int i = OrdersTotal(); i >=0; i--)                                            // цикл для проверки ордеров
{
int af=OrderSelect(i, SELECT_BY_POS,MODE_TRADES);                                // Шаг 1: OrderSelect Выбираем ордер (SELECT_BY_POS - по порядковому номеру), (MODE_TRADES -из отложенных и открытых)

if((OrderSymbol() == "EURUSD") && (OrderMagicNumber() == MagicNumber))return(0); // Шаг 2: Если символ EURUSD отсутствует,И если ордер присутствует , и ни один из ордеров НЕ содержит магикномер, то выходим из цикла.( выходим -значит откр. позицию) 
                                                                                    (если какое-либо условие из двух указанных не совпадает, то выходим) 
}
          

             
if ((Close[0]>High[1]))
{
send=OrderSend("EURUSD",OP_BUY,Lots,Ask,3,Bid-SL*Point,Bid+TP*Point,MagicNumber);
}

if ((Close[0]<Low[1]))  
{
send=OrderSend("EURUSD",OP_SELL,Lots,Bid,3,Ask+SL*Point,Ask-TP*Point,MagicNumber);
}

return(0);
}

私の理解では、定期的に空き状況を確認するようなものだと思います。(EURUSDがあるか、指定のMagicの注文があるか)いずれかの条件が欠けていれば、ポジションを建てる。両方の条件が揃った場合のみ、ポジションを建てる。

そして、ステップ2で問われる。手動で開いた注文が1つあるとします。そうすると、最初の条件(同じシンボルを持っている)を満たし、2番目の条件は満たさないことになります。このオーダーにはマジックが含まれていないからです。そして、もし条件の1つが一致しなければ、コードは注文を開くはずです。これは、まさにこのコードの通りです。しかし、次のティックでは、3次、4次、5次と開いていく......。

なぜ3つ目の注文を開けるのか?

しかし、両方の条件を満たすオーダーが合計で2つあるのです。オープンではなく、チェック(return(0)への変更)があるはずです。オープニングではありません。

Совершение сделок - Торговые операции - Справка по MetaTrader 5
Совершение сделок - Торговые операции - Справка по MetaTrader 5
  • www.metatrader5.com
Торговая деятельность в платформе связана с формированием и отсылкой рыночных и отложенных ордеров для исполнения брокером, а также с управлением текущими позициями путем их модификации или закрытия. Платформа позволяет удобно просматривать торговую историю на счете, настраивать оповещения о событиях на рынке и многое другое. Открытие позиций...
 
皆さん、おやすみなさい。mql5で、チャート上に線を引き(画像添付)、この線のすべての座標をファイルに記録するコードを書けるかどうか教えてください。このラインを基準にするならば、トレーディングロボットで 直接
 
GlushkoV_V_V:
皆さん、おやすみなさい。mql5で、チャート上に線を引き(画像添付)、この線のすべての座標をファイルに記録するコードを書けるかどうか教えてください。線を引いてそこに座標を記入する場合は、線の簡単なトレースが必要です。

全てはドキュメントに 書かれています。

Документация по MQL5: Графические объекты / ObjectCreate
Документация по MQL5: Графические объекты / ObjectCreate
  • www.mql5.com
[in]  Номер подокна графика. 0 означает главное окно графика. Указанное подокно должно существовать, в противном случае функция возвращает false. Возвращает true при успешной постановке команды в очередь указанного графика, иначе false. Если объект был уже создан ранее, то производится попытка изменить его координаты. При вызове ObjectCreate...
 
Сергей Таболин:

全てはドキュメントに 書かれています。

ありがとうございます。もしかしたら、これを作るのを手伝ってくれるかもしれませんね。もちろん、無料で。

 
GlushkoV_V_V:

ありがとうございます。でも、もしかしたら、こういうものを作るのを手伝ってくれるかもしれませんね。もちろん、タダではありませんよ。

無料ではありません - それはあなたのため です)))

Торговые приложения для MetaTrader 5 на заказ
Торговые приложения для MetaTrader 5 на заказ
  • www.mql5.com
Убрать из советника второй индикатор заменить другим,изменить условие открытие ордера .Условие сделки покупка: НМА линия вверх второй индикатор столбик гистограмы выше нуля (второй индикатор пересечение нуля точка входа) по закрытой свече если нма и второй индикатор не изменили показания совершается покупка для продаже наоборот.Изменить...
 
ありがとうございます。しかし、私にとっては中国語のようなもので、コードにどのように実装すればいいのかわかりません。
 
Alexey Belyakov:

私の理解では、定期的に空き状況を確認するようなものだと思います。(EURUSDがあるか、指定のMagicの注文があるか)いずれかの条件が欠けていれば、ポジションを建てる。その両方の条件を満たした場合のみ、ポジションを建てるのです。

そして、ステップ2で問われる。手動で開いた注文が1つあるとします。そうすると、最初の条件(同じシンボルを持っている)を満たし、2番目の条件は満たさないことになります。このオーダーにはマジックが含まれていないからです。そして、もし条件の1つが一致しなければ、コードは注文を開くはずです。これは、まさにこのコードの通りです。しかし、次のティックでは、3次、4次、5次と開いていく......。

なぜ3つ目の注文を開けるのか?

しかし、両方の条件を満たすオーダーが合計で2つあるのです。オープンではなく、チェック(return(0)への変更)があるはずです。が、オープニングは別。

== - 等しい場合 != - 等しくない場合。Continue - ループの反復を終了し、新しいループの反復を開始する。Breaking - サイクルの終了とサイクルに続く次の演算子への移行、return - 関数の終了、この場合は Onstart と新しい tick の待ち受け。また、自分のマジックを使った注文が開いている場合は、機能を終了し、新しいティックを待つために離れる必要があります。

質問、現在のウィンドウで注文を開きたい場合、なぜツールを明示的に指定する必要があるのでしょうか、それとも他のツールのウィンドウから注文を開きたいのでしょうか?また、何件注文を出したいのかも不明です。あなたのコードによると、1つの注文しか開くことができず、それが閉じられた後、2つ目の注文が開かれることになります。マジシャンとオープンウィンドウツールが1つずつありますね。また、注文の開始条件は、ユーロバックスではなく、カレント商品に対してチェックされます。

datetime some_time=TimeCurrent();
//extern string Symbol3 = ""; //Инструмент (""текущий по умолчанию)
extern int P=1;          //Таймфрейм
extern int MagicNumber = 100500;  // Установили магик


int start()
{

int send;
                                     
double SL=200;                                   
double TP=200;                       
double Lots=1;       

for(int i = OrdersTotal(); i >=0; i--)                                            // цикл для проверки ордеров
{
bool af=OrderSelect(i, SELECT_BY_POS,MODE_TRADES);     // OrderSelect возвращает тип bool                           
                                               // Шаг 1: OrderSelect Выбираем ордер 
                                   //(SELECT_BY_POS - по порядковому номеру), (MODE_TRADES -из отложенных и открытых)

if((OrderSymbol() == Symbol()) && (OrderMagicNumber() == MagicNumber))return(0); // Шаг 2: Если символ Выбранного ордера 
                                        //равен EURUSD (заменено на текущий инструмент открытого окна) ,
                                       // И если магик Выбранного ордера равен магик то выходим из функции Онстарт.
// Если же наш ордер не будет выбран из ордеров терминала, то цикл закончится и начнется выставление ордеров. 
                                                                                   
}
          

             
if ((Close[0]>High[1])) // клоз и хай здесь для текущего окна и инструмента. 
{
send=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-SL*Point,Bid+TP*Point,MagicNumber); // так же здесь цены аск и бид тоже для текущего инструмента
}

if ((Close[0]<Low[1]))  
{
send=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+SL*Point,Ask-TP*Point,MagicNumber); // и поинт кстати тоже.
}

return(0);
}
 
Valeriy Yastremskiy:

== - 等しい場合 != - 等しくない場合。Kontinue - ループの反復を終了し、新しいループの反復を開始します。Break - ループを終了し、ループに続く次の演算子に進みます。return - 関数(この場合は Onstart)を終了し、新しい tick を待ちます。また、自分のマジックを使った注文が開いている場合は、機能を終了し、新しいティックを待つために離れる必要があります。

質問、現在のウィンドウで注文を開きたい場合、なぜツールを明示的に指定する必要があるのでしょうか、それとも他のツールのウィンドウから注文を開きたいのでしょうか?また、何件注文を出したいのかも不明です。あなたのコードによると、1つの注文しか開くことができず、それが閉じられた後、2つ目の注文が開かれることになります。マジシャンとオープンウィンドウツールが1つずつありますね。また、注文の開始条件は、ユーロバックスではなく、カレント商品に対してチェックされます。

- はい、現在のウィンドウで開きたいのです。

- 1オーダーです。前の注文が終了するまで、次の注文は開始されません。

"また、注文の 開始条件は、ユーロバックスではなく、カレント商品に対してチェックされます。" - それから?

((OrderSymbol() == "EURUSD" )  ???
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
Документация по MQL5: Константы, перечисления и структуры / Торговые константы / Свойства ордеров
  • www.mql5.com
Приказы на проведение торговых операций оформляются ордерами. Каждый ордер имеет множество свойств для чтения, информацию по ним можно получать с помощью функций Идентификатор позиции, который ставится на ордере при его исполнении. Каждый исполненный ордер порождает сделку, которая открывает новую или изменяет уже существующую позицию...
 
Alexey Belyakov:

- はい、現在のウィンドウで開きたいのです。

- 1オーダーです。前の注文が終了するまで、次の注文は開始されません。

"また、注文の 開始条件は、ユーロバックスではなく、現在の商品に対してチェック されます。" - それから?

そして、何を、例えば、あなたが開いているウィンドウではなく、ユーロバックスが、Eurofunt、あなたはそれが真であれば、選択した注文記号をユーロバックスと比較し、ユーロバックスに注文があり、もし我々のマジック、OnStart関数からリターニー、そうでなければ、我々はユーロバックスに注文が設定され、クロズ、ハイ、Asc、入札、これらのインスタンスの入札とAscは異なるため、オープン注文時にはエラーになることがあります。また、Symbol()はカレントウィンドウのシンボルを返すので、エラーは発生しません。

メタエディタからテンプレートを使用することができます。左上に「新規作成」ボタンがあります。OnStart関数はまだ使われていますが、それは正しくなく、OnStartはスクリプトのためのものです。正しいテンプレートです。

//+------------------------------------------------------------------+
//|                                                    forumtest.mq4 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                                  https://qstr.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://qstr.ru"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   
  }
//+------------------------------------------------------------------+

正しいコードです。注文のコメントが抜けていますし、コードにマジコンが計上されていません。冒頭の警告の中に、Implicit type conversion of number to string(数値から文字列への暗黙の型変換)と記されています!!!

//+------------------------------------------------------------------+
//|                                                    forumtest.mq4 |
//|                        Copyright 2019, MetaQuotes Software Corp. |
//|                                                  https://qstr.ru |
//+------------------------------------------------------------------+
#property copyright "Copyright 2019, MetaQuotes Software Corp."
#property link      "https://qstr.ru"
#property version   "1.00"
#property strict

datetime some_time=TimeCurrent();
//extern string Symbol3 = ""; //Инструмент (""текущий по умолчанию)
extern int P=1;          //Таймфрейм
extern int MagicNumber = 100500;  // Установили магик
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   int send;
                                     
double SL=200;                                   
double TP=200;                       
double Lots=1;       

for(int i = OrdersTotal(); i >=0; i--)                                            // цикл для проверки ордеров
{
bool af=OrderSelect(i, SELECT_BY_POS,MODE_TRADES);     // OrderSelect возвращает тип bool                           
                                               // Шаг 1: OrderSelect Выбираем ордер 
                                   //(SELECT_BY_POS - по порядковому номеру), (MODE_TRADES -из отложенных и открытых)

if((OrderSymbol() == Symbol()) && (OrderMagicNumber() == MagicNumber))return; // Шаг 2: Если символ Выбранного ордера 
                                        //равен EURUSD (заменено на текущий инструмент открытого окна) ,
                                       // И если магик Выбранного ордера равен магик то выходим из функции Онстарт.
// Если же наш ордер не будет выбран из ордеров терминала, то цикл закончится и начнется выставление ордеров. 
                                                                                   
}
          

             
if ((Close[0]>High[1])) // клоз и хай здесь для текущего окна и инструмента. 
{
send=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-SL*Point,Bid+TP*Point,"My order",MagicNumber,0,clrGreen); // так же здесь цены аск и бид тоже для текущего инструмента

}

if ((Close[0]<Low[1]))  
{
send=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Ask+SL*Point,Ask-TP*Point,"My order",MagicNumber,0,clrGreen); // и поинт кстати тоже.
}

return;
  }
//+------------------------------------------------------------------+
 
Valeriy Yastremskiy:

あなたの例には多くの誤りがあります。

for(int i = OrdersTotal(); i >=0; i--)  

があるはずです。

for(int i = OrdersTotal()-1; i >=0; i--)  

ここでは価格は正規化されていませんOrderSend(Symbol(),OP_BUY,Lots,Ask,3,Bid-SL*Point,Bid+TP*Point,"My order",MagicNumber,0,clrGreen);

ここで、条件がfalseの場合、なぜOnTick()からの終了が必要なのか、そのロジックが理解できないのです。

if((OrderSymbol() == Symbol()) && (OrderMagicNumber() == MagicNumber))return;

おそらく、このままループを続けて、単純に注文の数を計算 すべきなのでしょう。

あなたの例はロジックが非常にシンプルなので、他のタスクのために修正するのは難しいのでは......。を付けたいのだろう。