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

 
hoz:


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

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

呼び出し機能はこうだ。

もしかしたら、ベイの方が条件が合っているのかも?確かに、今日はユーロの下落が激しかったので、売り建てしかしていませんが、それでも、何もしないよりはマシでしょう!?
 
borilunad:
もしかしたら、バイの方が条件がいいのかも?正直なところ、今日はユーロの下落が非常に弱いので、売りしか建たないのですが、とにかく何もないよりはましなのです。


いいえ、シグナルはintGetGeneralSignal() に記述されており、明確に動作します。信号は原始的なもので、試しに受けてみただけです。PCIが上限のボーダーを超えたら買い、下限のボーダーを超えたら売り。私自身はインデックスを使っていないのですが、実験的にこれだけ確認することにしました。

それでは、どうぞ。フラッグがなければ、すべてが完璧に機能します。しかし、国旗はそうではありません。int FindOrders(bool&long,bool&short) 関数に与えられたタイプの注文があり、その利益がゼロ以下であるとき、関数GetGeneralSignal()への参照によれば、私の関数は特定のフラグに偽の 値を渡さなければなりませんが、実際にはフラグは常に真を示して いるのです。

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
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
                 {
                     if (profitL < OrderProfit())
                     {
                         profitL = OrderProfit();
                         pr("profitL =" + profitL);
                         if (profitL < 0)
                         long = false;
                     }
                 }

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

プリンターで見ることはできるのですが、なぜフラグが変わらないのかが不明です。

ちなみに、印刷物では注文の採算性を示しました。

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
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();
                     pr("profitL =" + profitL);
                     if (profitL < OrderProfit())
                         if (profitL < 0)
                         long = false;
                 }

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

そして、print the value of the flagsでは、このように表示されます。

つまり、収益性がゼロ以下の場合、対応するフラグがfalseに 設定されるべきなのは明らかなのですが、そうはならないのです......。すべてが初歩的なことのように思えるが、何かがうまくいっていない。

 
hoz:


いいえ、int型のGetGeneralSignal() 関数にシグナルがあり、これがうまく機能します。信号は原始的なもので、試しに受けてみただけです。PCIが上のボーダーを超えたら買い、下のボーダーを超えたら売り。私自身はインデックスを使っていないのですが、実験的にこれだけ確認することにしました。

それでは、どうぞ。フラッグがなければ、すべてが完璧に機能します。しかし、国旗はそうではありません。int FindOrders(bool&long,bool&short) 関数に与えられた型の注文があり、その利益がゼロ以下であるとき、関数GetGeneralSignal()への参照によると、私の関数は、あるフラグに偽値を 渡さなければなりませんが、フラグは常に真を 含んでいます。

プリントで見るのですが、なぜ旗が変わらないのか理解できません。
ほら、どっちもlong=falseって書いてあるから、どうやって開くんだ?
 
hoz:



印刷物ではわかるのですが、なぜ旗が変わらないのか が不明なのです。

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
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;
                 }

                 else 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 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
                 {
                     if (profitL < OrderProfit())
                     {
                         profitL = OrderProfit();
                         pr("profitL =" + profitL);
                         if (profitL < 0)
                         long = false;
                     }
                 }

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

以下はスクリーンショットです。

チャートで見ると、バイは極小で、フラグ=TRUは全て同じであることがわかると思います。

 
こんばんは、アラートフォームを 条件が成立するたびに表示させるのではなく、条件が成立したときに一度だけ表示させる方法を教えてください。
 

かわいそうに!関数で遅くなるループなしで、どのように動くか書いてみますこれがあなたのコードです。でも、これを何に変えればいいのでしょうか!

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
bool& long, bool& short)
double profitL,               // Профит лонговой позиции
       profitS;               // Профит шортовой позиции
 
// int start()
 
//.........................................


  
   if(ExistPositions() == false)
   {
      if(long == true)
      {
         OrderSend(.......OPEN_BUY........................)  
      }
      if(short == true)
      {
         OrderSend(.......OPEN_SELL.........................)
   }  }
   if(ExistPositions() == true)
   {
      if(profitL > 0 && long == true && short == false)
      {
         OrderSend(.......OPEN_BUY........................)  
      }
      if(profitS > 0 && short == true && long == false)
      {
         OrderSend(.......OPEN_SELL.........................)
   }  }
      


                     
この方式は、痙攣がなく、即効性がある!不要な機能をなくすExistPositions()関数は、「Dear Kim!」の「便利な関数」にあります。
 
borilunad:

かわいそうに!関数で遅くなるループなしで、どのように動くか書いてみますこれがあなたのコードです。でも、これを何に変えればいいのでしょうか!

この方式は簡単で、即効性があります不要な機能をなくすExistPositions()関数は、「Kim!!!の便利な関数たち」にあります。


Borisさん、ExistPositions 関数はループが同じで、不要なチェックが多いだけなので、途中でもたつく ことはないですよ。あなたの論理は私にも理解できますが、前バージョンの操作不能の理由が開示されていないので、不思議です :)

こんなフラッグも使っているんですね。

 if(profitL > 0 && long == true && short == false)

そして、正しく返ってこないことを実証していたのです。

したがって、この関数に変数profitLとprofitSが存在する場合は、フラグは必要ありません。

その結果、こうなった。

//+-------------------------------------------------------------------------------------+
//| Поиск своих ордеров                                                                 |
//+-------------------------------------------------------------------------------------+
int FindOrders(double& profitL, double& profitS)
{
   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 (profitL < OrderProfit())
                     {
                         profitL = OrderProfit();
                         pr("profitL =" + profitL);      // Выводим профим через коммент на график
                     }
                 }
                 if (OrderType() == OP_SELL)       // Найден ордер типа OP_SELL
                 {
                     if (profitS < OrderProfit())
                     {
                         pr("profitS =" + profitS);     // Выводим профим через коммент на график
                         profitS = OrderProfit();
                     }
                 }
                 t++;
              }
   }
   
   return (t);
}
//+-------------------------------------------------------------------------------------+
//| Получаем общий торговый сигнал                                                      |
//+-------------------------------------------------------------------------------------+
int GetGeneralSignal()
{
   double profitL,               // Профит лонговой позиции
          profitS;               // Профит шортовой позиции
        
   if (FindOrders(profitL, profitS) > 30)
       return (SIGNAL_NO);

   if(ExistPositions() == false)
   {
      if (GetRSI(1) < i_RSIToUpLimit)
      {
         if (GetRSI(0) > i_RSIToUpLimit)
         {
             return (SIGNAL_BUY);
         }
      }
       if (GetRSI(1) > i_RSIToDnLimit)
       {
         if (GetRSI(0) < i_RSIToDnLimit)
         {
             return (SIGNAL_SELL);
         }
      }
   }
   if(ExistPositions() == true)
   {
      if (GetRSI(1) < i_RSIToUpLimit)
         if (GetRSI(0) > i_RSIToUpLimit)
         {
            if(profitL > 0)
               return (SIGNAL_BUY);
         }
      if (GetRSI(1) > i_RSIToDnLimit)
      {
         if (GetRSI(0) < i_RSIToDnLimit)
            if(profitS > 0)
               return (SIGNAL_SELL);
      }
   }
            
   return (SIGNAL_NO);
}

繰り返しになりますが、信号で開くのではなく、何でもいいから開くのです。

 
みなさん、こんにちは。
仮想トレールを作っているのですが、trawlであるcloselevel=profitpips-TrailingStopで 問題が発生し、GlobalVariableSet("tral",0)はそのままONになっていますが、変数
closelevel 変数に、 profitpips-TrailingStopの 代わりにprofitpipsの 値(現在の利益をpipsで表したもの)が割り当てられ、それに伴うすべての結果が発生しますo_o。



void Trailing()
   {
    if(!GlobalVariableCheck("tral")&&profitpips>=TrailingStart)
     {
      closelevel=profitpips-TrailingStop;
      GlobalVariableSet("tral",0);
      }
    if(GlobalVariableCheck("tral")&&profitpips>=closelevel+TrailingStop)closelevel=profitpips;
    if(GlobalVariableCheck("tral")&&profitpips<=closelevel)
     {
      Print ("ВСЁ ОТЛИЧНО ЗАКРЫЛИСЬ ПО ТРАЛЛУ");
      for (int i=0; i<NumberOfTry; i++) 
        {
         CloseAll();
         Lot=LOT;
        }
      }  
     return;}

わかったんだ、この線
if(GlobalVariableCheck("tral")&&profitpips>=closelevel+TrailingStop)closelevel=profitpips;  


に変更した。
if(GlobalVariableCheck("tral")&&profitpips-TrailingStop>=closelevel+TrailingStop)closelevel=profitpips; 



現在、利益が増加 してもcloselevelは変更 されませんが...。

もう、わかったんです。



 
hoz:


ボリスExistPositions 関数もループは 同じですが、不要なチェックが多くなっているので、途中でもたつく ことはありません。あなたの論理は私にも理解できますが、前バージョンの操作不能の理由が開示されていないので、不思議です :)

また、これらのフラグを使用していますね。

そして、正しく返ってこないことを実証しています。

したがって、この関数に変数profitLとprofitSが存在するのであれば、フラグは必要ない。

そういうことだったんですね。

ここでも、信号で開くのではなく、何でもいいのです。

じゃあ、自分のところで調べてみてよ!コードの単語ごとに関数があり、変数でやりくりしているんですね。その分、コードが重くなるんです。関数がないとどうしようもないときは、関数を使うべきです!キムさんのコードで不要なものはすべてコメントしました。忘れてはいけないのは、「どうしたらいろいろな条件下でプログラムを速く走らせることができるか」ということをみんなに聞いたことだ。5分間ですべてのダニを1年間検査できるようになりました。すべての条件と関数を調べ、不要なものはすべて捨てました。