[ARCHIVE]フォーラムを乱立させないために、どんなルーキーの質問でも。プロフェッショナルの皆さん、通り過ぎないでください。あなたなしではどこにも行けない - 5. - ページ 333

 
親愛なるプログラマーの皆さん、こんにちは。

次のような分析が必要です。プログラムは与えられたパラメータを分析し、その結果を日付の集合を表す表の形で別のウィンドウに出力する必要があります。プログラムが履歴を解析して、必要な日付を表示することです。

それとも、履歴をエクスポートして、他の言語で書かれたプログラムを使ってデータを分析する方が良いのでしょうか?

ありがとうございました。
 
GygaByte:


その通りなのですが、実際にやってみると、必ずしもそうではありません。

小数点以下5桁目=5(1.xxxx5)とすると、やはり値が歪む。

という質問はまだ有効です...

P.S. 一般的に、MagicNumberに価格値を割り当てる必要があるのですが...。そして、ここに MagicNumber - int と入力し、次のように変換しようとします。

他に誰かアドバイスしてくれる人はいますか?

ありがとうございます。

丸め方を変えて出力している-だから完全な数字が見えない-から、何かが歪んでいると思うのでしょう。デフォルトでは、実数を出力する場合、4桁目に四捨五入して出力 されます。5桁の数値の場合、明示的に四捨五入して出力する必要があります。

Alert ("bid= ",bid," bid_minus= ",DoubleToStr(bid_minus,Digits)," bid_plus= ",DoubleToStr(bid_plus,Digits), " Bid = ",DoubleToStr(Bid,Digits));

自分の絵を見てください - DoubleToStr()なしの出力入札とDoubleToStr()ありの出力入札です。

 
hoz:

Artyomさん、Borisさん、私の質問を「噛み砕いて」説明していただき、ありがとうございます。今回のように、かなり単純なことでつまづくことがあるのですが......。

今、新たな疑問が湧いてきました。

未決済注文の金額tを 計算する関数に、指定した種類の注文で指定した利益を持つものを検索し、その利益とある指定した値(現在は0)を比較する機能を追加したのです。さらに、未決済の注文がない場合、関数FindOrders()のパラメータで値Trueの2つのフラグが返され、それは注文を送信できることを意味しますが、注文がある場合、利益は設定値より高いことを確認し、設定値より低い場合、関数FindOrders()のパラメータで値Falseの2つのフラグは、ある方向の負け注文があっても負け方向に投資しないことで、確認されているのです。

その後、シグナル関数の中でFindOrders()関数を呼んでいます。

注文が全く開かずに動いた。その理屈は正しいようです。もしかして、どこが間違いなのかわかりますか?

すべて別機能で簡単にできることは理解していますし、できます。しかし、このバージョンではなぜ動かないのか、その理由を理解したい。

ビクター、あなたのアルゴリズムを完全に理解することはできませんが、いくつかのアドバイスをすることはできますよ。ロジックに間違いがあると、私もそうなります。条件が曖昧であったり、相互に排他的であることが判明した場合、プログラムは失速します。やりたいことは分かっていても、コードのロジックを正しく構築できないのかもしれません。それらの不具合を探し、条件の全順序を紙に矢印で書き、ひとつひとつわかりやすくしていきましょうがんばってください。
 
borilunad:
ビクター、私はあなたのアルゴリズムを完全に理解することはできませんが、いくつかのアドバイスをすることはできますよ。これは、ロジックに間違いがあるときにも起こります。条件が曖昧であったり、相互に排他的であることが判明した場合、プログラムは失速します。やりたいことは分かっていても、コードのロジックを正しく構築できないのかもしれません。これらの不具合を探し、実行させたい条件の全順序を、わかりやすいように矢印のついた紙にひとつひとつ書き出してみてくださいがんばってください。


そこには、単純なロジックがあるわけです。開いている注文がない場合は、シグナルによって注文が開始されます。

そして、開いている注文があれば、特定のシグナルによって、指定された方向(買いまたは売り)の注文の利益がある値より高い場合、つまり少なくともマイナスにならない場合に、注文が開かれるはずです。(テストのため、そこに0を 設定しました)。

1つだけ論理的な誤りを発見しました。以下は、出てきた内容です。

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(bool& long, bool& short)
{
   int t, total = OrdersTotal() - 1;
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)        // Найден ордер типа OP_BUY
                 {
                     if (OrderProfit() < 0)        // Если профит ордера ниже заданного значения,..
                         long = false;              // .. покупка запрещена
                 }

                 if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     if (OrderProfit() < 0)        // Если профит ордера ниже заданного значения,..
                         short = false;             // .. продажа запрещена
                 }
                 t++;
              }
   }
   
   return (t);
}

//+-------------------------------------------------------------------------------------+
//| Получаем общий торговый сигнал                                                      |
//+-------------------------------------------------------------------------------------+
int GetGeneralSignal()
{
   bool short = true,
        long = true;
        
   if (FindOrders(short, long) > 3)
       return (-1);

   if (GetRSI(1) < i_RSIToUpLimit)
      if (GetRSI(0) > i_RSIToUpLimit)
      {
         if (long == true)
             return (SIGNAL_BUY);
      }

   if (GetRSI(1) > i_RSIToDnLimit)
      if (GetRSI(0) < i_RSIToDnLimit)
      {
         if (short == true)
             return (SIGNAL_SELL);
      }
            
   return (-1);
}

これで売り注文はシットで正しく開くようになりましたが、ロングは全く開きません。フラグは両方の変数1の 値、すなわち真を 持つが。

 

mt4でこの問題があります。

私のコンピュータでmt4ブローカーソフトウェア(つまり先週から使っている3つ)を起動すると、私のコンピュータに「ユーザーとして実行」ウィンドウが表示されます(「ユーザーとして実行」を使うのと同じです)。どのアクションを選択しても、mt4は正常に起動します。

どうすれば、このウィンドウなしでmt4.ehを実行できるようになりますか?もしかしたら、何が悪いのか知っている人、理解している人がいるかもしれない......。

 

こんにちは、保留中の注文を 迅速にキャンセルする必要が生じました。 OrderCloseは、保留中の注文を無視する。どのオペレーターが使いやすいか、また、このオプションはあるか?

 
Notter:

こんにちは、保留中の注文を迅速にキャンセルする必要が生じました。 OrderCloseは、保留中の注文を無視する。どのオペレーターが使いやすいか、また、このオプションはあるか?


成行注文のみを決済することができ、保留中の注文を削除するにはOrderDelete オペレータが必要です。
 

ホズ

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

 
hoz:


だから、すべてのロジックがシンプルなのです。開いている注文がない場合、シグナルによって注文が開かれるようにする必要があります。

そして、開いている注文があれば、特定のシグナルによって、指定された方向(買いまたは売り)の注文の利益がある値より高い場合、つまり少なくともマイナスにならない場合に、注文が開かれるはずです。(テストのため、そこに0を 設定しました)。

1つだけ論理的な誤りを発見しました。以下は、出てきた内容です。

現在、売り注文は正しくシットで開いていますが、ロングは全く開きません。フラグの値は両方とも1、すなわち であるが。

ビクター、少しは調べろよ!ロングバイをコメントアウトすることで、ショートセルがどのように機能するかをログで確認することができますその逆も然りで、何が違うのか、なぜうまくいかないのか、その原因を探ってみてください
 
borilunad:
ビクター、確認するぞ!長辺をコメントアウトすることで、短辺がどのように機能するかをログで確認しましょうその逆も然りで、何が違うのか、なぜうまくいかないのか、その原因を探ってみてください


Borisさん、intGetGeneralSignal() の条件の一つをコメントアウトすると、オープニングがクリアになりますよ。

追跡してみました。現在開いている注文の収益性がマイナスの場合、フラグの値は変わりません。以下は、フラグshortと longの 値をfalseに 設定する、つまりマイナス注文がある場合にポジションを開く ことを禁止するように書き換えた関数です。

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(bool& long, bool& short)
{
   int t, total = OrdersTotal() - 1;
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
   
   for (int i=total; i>=0; i--)
   {
      if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) continue;
          if (OrderSymbol() != Symbol()) continue;
              if (OrderMagicNumber() != i_magic) continue;
              {
                 if (OrderType() == OP_BUY)        // Найден ордер типа OP_BUY
                 {
                     Print("if (OrderType() == OP_BUY)");
                     profitL = OrderProfit();
                     if (profitL < OrderProfit())
                         if (profitL < 0)
                         long = false;
                 }

                 if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     Print("if (OrderType() == OP_SELL)");
                     profitS = OrderProfit();
                     if (profitS < OrderProfit())
                         if (profitS < 0)
                         long = false;
                 }
                 t++;
              }
   }
   
   return (t);
}

以下は呼び出し側の機能です。

//+-------------------------------------------------------------------------------------+
//| Получаем общий торговый сигнал                                                      |
//+-------------------------------------------------------------------------------------+
int GetGeneralSignal()
{
   bool short = true,
        long = true;
        
   if (FindOrders(short, long) > 15)
       return (SIGNAL_NO);

   Print("long = ", long);
   Print("short = ", short);
      
   if (GetRSI(1) < i_RSIToUpLimit)
      if (GetRSI(0) > i_RSIToUpLimit)
      {
         if (long == true)
             return (SIGNAL_BUY);
      }
           
   if (GetRSI(1) > i_RSIToDnLimit)
      if (GetRSI(0) < i_RSIToDnLimit)
      {
         if (short == true)
             return (SIGNAL_SELL);
      }
            
   return (SIGNAL_NO);
}