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

 
ObjectCreate で時間と価格のポイントが 2 から 30 まであるのはなぜですか?チャートに追加してみましたが、最初のポイントしか表示されません。
ObjectCreate(0,"name",OBJ_ARROW_LEFT_PRICE,0,TimeCurrent()-600,1.29400,TimeCurrent()-1200,1.29500);   
 
Valerius:

このコードはOnInitではなく、OnTick()に記述する必要があります。

試してみたが、全く効果がない。
警告1件
 
Igor Makanu:

いいえ、できません。

説明できない......テンプレートの仕組みこのようなものです。このような関数を呼び出すまで、コンパイラはその存在について何も知りません(しばしば、呼び出しがなければコンパイラのエラーさえ発生しません)。

そして、そのようなテンプレート関数を呼び出すと、コンパイラは必要な型を埋めてから、すべてが正しく動作することをチェックします。

そして、別の種類のパラメータを指定してテンプレートを呼び出すと、コンパイラは新しい関数、つまりもうひとつの関数を作成します。


ふー、そういうことか )))



UPDです。

ができますが、テンプレートの型が一致していれば、以下の例では正しく動作します。

ありがとうございます、ドキュメントよりもさらに明確です)テンプレートで変数を事前定義 すると、変数を指定しないことができないことがわかりました。ファイルへの印刷に必要です。ログには、レコードを分割するオプションはありません。ログが5本あればいいのですが...)。その結果、テンプレートでは、変数のタイプを希望するものに持っていかないオプションがあり、それはテンプレート関数内で行うことができますが、変数の数を完全に指定する必要があります。また、必要な型の変数があらかじめ定義されている単純な関数は、呼び出し時に指定する変数の数を少なくする機会を与えますが、変数の型は必要なものに持っていく必要があります。もちろん、呼び出し時に行うことも可能ですが、記録が長くなりすぎてしまいます。

 
Valerius:

皆さん、こんにちは。

ストップロスを変更する関数を作りました。しかし、それが動作すると、EURUSD,H1: OrderModify error 130と表示されます。

そして、その価格はストップロスを設定すべき場所からは程遠い。

以下はその機能です。


....
    err=OrderModify(OrderTicket(), OrderOpenPrice(),New_Stop( NormalizeDouble(OrderOpenPrice()+spred*point, 
digits)), OrderProfit(), 0, clrNONE);// Цена открытия плюс спред может быть в зоне заморозки.
.....
.....
double New_Stop(double Parametr) // Проверка стоп-прик.
  {
   double Min_Dist=MarketInfo(Symb,MODE_STOPLEVEL);// Миним. дистанция
   if(Parametr<Min_Dist) // Если меньше допуст.
     {
      Parametr=Min_Dist;                        // Установим допуст.
      Alert("Increased the distance of a stop order or the opening price of pending orders.");
     }
   return(Parametr);                            // Возврат значения
  }
 
Valerius:

この方法で試してみてください。


ありがとうございます!うまくいきました。

しかし、もう2つのニュアンスがあります。

1 当週の金曜日と前週の金曜日にそれぞれオープンした注文をクローズしない条件を追加するにはどうすればよいですか?

2.コードの修正方法 - OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE);

という 警告を 消すには?MarketInfo(nameSym,MODE_DIGITS)..." と表示される。

 
こんばんは。直近に決済された注文を選択するコードはどのようなものでしょうか?OrderSelect(OrdersHistoryTotal, SELECT_BY_POS, MODE_HISTORY)」とありますが、本当にこんな感じでしょうか?
 
GetAmountLotFromOpenPos関数が-1717986918を返すのですが、どうすれば直せますか?
 

アドバイスをお願いします。

テスターでは、GetAmountLotFromOpenPosロットサミング関数の戻り値は-1717986918となります。

 
Valeriy Yastremskiy:

その理由がわかりました。OrderProft()の代わりにOrderTakeProfit()をOrderModifyに入れればよかったです。少し目を通しました。

とにかくありがとうございました。

 
Yerkin Sagandykov:

ありがとうございます!うまくいきました。

しかし、もう2つのニュアンスがあります。

1 どのような条件を追加する当週の金曜日、および前の週の金曜日に開かれた注文を閉じないために、それぞれ、閉鎖されましたか?

2.コードの修正方法 - OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE);

という 警告を 消すには?MarketInfo(nameSym,MODE_DIGITS)..." のことなのでしょう。

最初の質問では、この関数を作る必要があります。


for(int is=OrdersTotal()-1; is>=0; is--)
{
if(OrderSelect(is,SELECT_BY_POS,MODE_TRADES))
{当週でない週の金曜日にオープンされた注文をクローズします。この場合、当週の金曜日に注文を締め切ることはありません。
if(OrderMagicNumber()==Magic && TimeDayOfWeek(TimeCurrent())==5 && TimeDayOfWeek(OrderOpenTime())==5 && TimeDayOfYear(OrderOpenTime())<TimeDayOfYear(TimeCurrent()) )
{
if (OrderType()==OP_BUY) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_BID),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE) とする。
if (OrderType()==OP_SELL) result=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(MarketInfo(nameSym,MODE_ASK),MarketInfo(nameSym,MODE_DIGITS)),3,CLR_NONE) とする。
if(!result) {error=GetLastError(); Print("LastError = ",error, ",Symbol()); }.
else {error=0;}。
さもなくば
{Print("NoMagic ",OrderMagicNumber();} // for Debug
さもなくば

{Print("Error when order select ", GetLastError();})注文時にエラーが発生しました。


2問目には、次のような項目があるはずです。

OrderClose(OrderTicket(), OrderLots(), NormalizeDouble(MarketInfo(nameSym,MODE_ASK)), 3, clrNONE)です。

頑張ってください。