エラー、バグ、質問 - ページ 1886

 
Vladimir Karputov:


では、何が問題なのか?

iという数字の下に、こんなチケットで、こんな記号のポジションがあるというのは、どこで確認できるのでしょうか?一般的には、単純なシーケンス番号の出力とは別に、チケットやシンボルも出力しますよね。


異なる状況に対して、1つの関数が同じ値を出すのは普通なのでしょうか?

ZS:ところで、投稿の中に質問がありました。

要は、買いを選択すると、関数(PositionGetInteger(POSITION_TYPE))は0を返すということです。

また、存在しない位置を選択した場合にも、この関数は0を返します

 
Alexandr Bryzgalov:
異なる状況下で、1つの関数が同じ値を出すのは普通なのでしょうか?


異なるシチュエーション」とは?そして、私が上で勧めたようにすることです。

トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム

バグ、バグ、質問

ウラジミール・カルプトフ さん 2017.05.12 11:15

...

一般的には、単純なシーケンス番号の出力とは別に、チケットやシンボルも出力しますよね。


 
Alexandr Bryzgalov:

確認が必要なのは分かっているのですが、いろいろなことが起きてしまうので...。

PositionGetInteger

この関数は、PositionGetSymbol または PositionSelect 関数で事前に選択した、オープンポジションの要求されたプロパティを返します。位置のプロパティは、datetime, int 型でなければならない。この機能には、2つのバリエーションがあります。

1.プロパティの値を直接的に返す。

longGetInteger(
ENUM_POSITION_PROPERTY_INTEGERproperty_id// プロパティ識別子を 指定します。
);

2.関数の成功に応じて、true または false を返す。成功すれば、プロパティ値がターゲット変数に格納され、最後のパラメータに参照渡しされる。

boolPositionGetInteger()
ENUM_POSITION_PROPERTY_INTEGERproperty_id,// プロパティ 識別子を指定します。
long&long_var//プロパティの値を取得する
);

パラメータ

property_id

位置プロパティの[in]識別子。enumENUM_POSITION_PROPERTY_INTEGER の値のいずれかを指定することができる。

long_var

[out] 要求されたプロパティの値を取る long 型の変数。

戻り値

タイプロングの値。実行に失敗した場合、0を返す。

マジックの状況は、より薄くなっています。したがって、チェック(PositionGetInteger(POSITION_TICKET) > 0)を行うのが論理的である。
Документация по MQL5: Торговые функции / PositionGetInteger
Документация по MQL5: Торговые функции / PositionGetInteger
  • www.mql5.com
Торговые функции / PositionGetInteger - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
fxsaber:
マジコンではもっと微妙な状況です。だから、チェック(PositionGetInteger(POSITION_TICKET) > 0)を行うのが論理的である。

そうですね、確認が必要なのは良いことだと思います。

しかし、関数を書くときは、常に状況に応じて異なる値を返すように工夫するものです。

異なる状況下で関数から同じ値が出るというのは間違っていると思います。
 
Alexandr Bryzgalov:

が、関数を書くときは、常に状況に応じて異なる値を得ようとするものです。

これがMagicが語られる所以である。PositionGetInteger(POSITION_MAGIC)エラー時の戻り値は?
 
fxsaber:
マジックが言及したのはこのためです。PositionGetInteger(POSITION_MAGIC)エラー時の戻り値は?
0 - ポジションは手動で開きます。
 
Alexandr Bryzgalov:

一つの関数が、異なる状況下で同じ値を与えても良いのでしょうか?

ZS:ところで、投稿の中に質問がありました。

要は、買いを選択すると、関数(PositionGetInteger(POSITION_TYPE))は0を返すということです。

で、存在しない位置を選択した場合にも0を返します。


つまり、最初の呼び出しは、(ループのように)ポジションを保証したときに使われるのです。そして、2つ目の呼びかけの形がこちら

bool  PositionGetInteger( 
   ENUM_POSITION_PROPERTY_INTEGER  property_id,     // идентификатор свойства 
   long&                           long_var         // сюда примем значение свойства 
   );

いきなりポジションが選択された場合のために


そうして、「結果」という変数で得られるものを信じることで、すべてがうまくいくのです。

//+------------------------------------------------------------------+
//|                                                         posi.mq5 |
//|                                                      sanyooooook |
//|                                                 http://sn-bot.ru |
//+------------------------------------------------------------------+
#property copyright "sanyooooook"
#property link      "http://sn-bot.ru"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
//---
   int tot=PositionsTotal();
   for(int i=0;i<tot;i++)
     {
      ulong OrderTicket_=PositionGetTicket(i);
      long cmd=PositionGetInteger(POSITION_TYPE);
      if(OrderTicket_>0 && cmd<=POSITION_TYPE_SELL)
         Print("N",i,"cmd=",cmd);

     }
   ulong OrderTicket_=PositionGetTicket(100);
   long cmd=-3;
   bool result=PositionGetInteger(POSITION_TYPE,cmd);
   if(result)
      Print("N100 cmd=",cmd);
  }
//+------------------------------------------------------------------+
 
Alexandr Bryzgalov:
0 - ポジションは手動で開かれます。
しかし、それ以外の値では、誤解を招く恐れがあります。
 
Vladimir Karputov:


つまり、最初の呼び出しは、(ループのように)ポジションを保証したときに使われるのです。そして、2つ目の呼びかけの形がこちら

いきなりポジションが選択された場合のために


これを実行し、「結果」変数に得られるものを信じれば、すべてがうまくいくのです。

ということではなく、関数が異なる状況下で同じ値を返すかどうかが問題なのです。

確認方法はわかっています。

という疑問があった。

SZY:エラーは意図せずにできてしまい、そして100000のコードではそれを探すのに疲れてしまうものなのです。

えっ、失敗しなくていいんですか?)

 
Alexandr Bryzgalov:

これは質問ではありませんが、この関数は異なる状況下で同じ値を返します。

確認する方法を知っている

もともと、「これが普通なのか?


私が見たところ、あなたは私が示したコードをチェックしていないようです。まず確認してから、もう一度質問するというのはどうでしょう。