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

 
//записать

void SaveArray(string File, double &a[])
{
    int h = FileOpen(File, FILE_BIN|FILE_WRITE);
    if(h>0)
    {
      int sz = ArraySize(a); 
      FileWriteArray(h,a,0,sz);
      FileClose(h);
    }
}

//прочитать

void OpenArray(string File, double &a[], int sz)
{
    int h = FileOpen(File, FILE_BIN|FILE_READ);
    if(h>0)
    {
      ArrayResize(a,sz);
      FileReadArray(h,a,0,sz);
      FileClose(h);
    }
}
 
以下は、その広告です。
int Buy[];int Sell[];       string FileBuy="FileBuy.csv",FileSell="FileSell.csv";
 
paladin80:
プログラム実行時の資源消費を抑えるという観点から、変数型(int、doubleなど)の宣言はどこにするのが最適か。例えば、int i はグローバルに宣言することも、int start() の中で宣言することもできます ... for (int i=OrdersTotal()-1; i>=0; i--) ....externパラメータの直後にグローバルレベルで一度宣言するよりも、tick毎に宣言する方がコストがかかる気がするのですが。 それともリソースインテンシブの差は同じなのでしょうか?

すべての変数(メモリー位置)はプログラム開始時に一旦作成され、その後、本文中に出てくるところで初期化する必要がありますが(変数宣言)、必ずしもそうなるとは限らないので、正常に動作させたい場合は、宣言時に明示的に初期化することを忘れないようにしましょう。
 
シュルキン

あなたのコードと一致するようにコードを修正しました。
テストの結果、4つの注文が最初のティックで設定順にクローズし、5つ目の注文が次のティックでクローズしました。おそらく、何度もテストしているので、ここがおかしいのでしょう。
プログラムのコードとテスターのログをお渡ししています。
敬具シュルキン

クリアです。交換

for(i=0, int k=0; i<OrdersTotal();i++,k++)//

に。

int total=OrdersTotal();
for(i=0, int k=0; i<total;i++,k++)//
 
ヒストグラムのブロックごとにインジケータの値の合計を計算する方法を教えてください。インジケータを書きましたが、インストールしたときだけ動作し始めます。 前のバーでは何もしません!私は "しばらく "を循環させるために管理していない!ヘルプ、専門家。

	          
 

次のような状況があります。

//+-------------------------------------------------------------------------------------+
//| Блок поиска своих объектов                                                          |
//+-------------------------------------------------------------------------------------+
bool IsObjectFound()
{
   for (int obj=0; obj<=ObjectsTotal()-1; obj++)
   {
      objName = ObjectName(obj);
      isObj = ObjectFind(objName);
      objPrice1 = ObjectGet(objName, OBJPROP_PRICE1);
      objPrice2 = ObjectGet(objName, OBJPROP_PRICE2);
      objPriceCurr = ObjectGetValueByShift(objName,0);
   }
   Print("objPriceCurr = ", objPriceCurr);
      
      if (isObj != -1)  // Если объект найден, значит выходим из функции
         return (true);
         
   return (false); // Объект не найден!
}
//+-------------------------------------------------------------------------------------+
//| Функция start                                                                       |
//+-------------------------------------------------------------------------------------+
int start()
{
   int signal = GetSignal();
   
   if (IsObjectFound() == false)
   {
      Print("В окне отсуствуют объекты, поиск продолжается...");
      return (0);
   }

誤解のあるコードの一部を示しました。すべての変数はグローバルに宣言されています。IsObjectFound() 関数で、オブジェクトの最初の価格ポイントと2番目の価格ポイントの値、名前、現在のバーでのオブジェクトの価格値を取得します。オブジェクトが見つかった場合はtrue モードで そうでない場合はfalse で関数を終了する必要があります.

スタート時に、オブジェクトが見つからなければ関数を終了するという条件を規定しました。

if (IsObjectFound() == false)
   {
      Print("В окне отсуствуют объекты, поиск продолжается...");
      return (0);
   }

テスターで実行すると、オブジェクトは何も描かれておらず、何もない、むき出しのグラフが表示されます。それにもかかわらず、関数は終了せず、それに応じてプリントされません。

 Print("В окне отсуствуют объекты, поиск продолжается...");

スタート機能は継続されます。これはどういうことなのでしょうか?

 
全然ダメなんです。
 
どうしたんですか?
 

グローバル 変数はグローバル検索が可能です。データモデルを見ずに、アルゴリズムについて何が言えるのか?

データを正確にトレースしていく。そして,isObjは本当にbooleanで,その他もろもろ.

 
tara:

グローバル変数はグローバル検索が可能です。データモデルを見ずに、アルゴリズムについて何が言えるのか?

データを正確にトレースしていく。そして,isObjは本当にbooleanで,その他もろもろ.


//+-------------------------------------------------------------------------------------+
//|                                                TradingByLine.mq4                    |
//|                                                              hoz                    |
//|                                                                                     |
//+-------------------------------------------------------------------------------------+
#property copyright "hoz"
#property link      ""

extern string ___H0 = "Параметры отклонений зоны сигнала";
extern double dernovich = 40,
              faustUs = 40;
/*extern double limitOverLine = 3,
              limitUnderLine = 20;*/

string objName;                                  // Имя объекта
int isObj;                                       // Возвращает окно, которому принадлежит
                                                 // ..наденнный объект, либо -1
double objPrice1,                                // Первая координата цены луча     
       objPrice2,                                // Вторая координата цены луча
       objPriceCurr;                             // Цена объекта на заданном баре
int pt;

#define SIGNAL_BUY         0                     // Сигнал на покупку
#define SIGNAL_SELL        1                     // Сигнал на продажу
#define SIGNAL_NO         -1                     // Сигнала нет

//+-------------------------------------------------------------------------------------+
//| Функция иницилизации                                                                |
//+-------------------------------------------------------------------------------------+
int init()
{
   if(Digits == 2 || Digits == 4)
     pt = Point;
   if(Digits == 1 || Digits == 3 || Digits == 5)
     pt = Point*10;
   if(Digits == 6)
     pt = Point*100;
   if(Digits == 7)
     pt = Point*1000;

  return (0);
}
//+-------------------------------------------------------------------------------------+
//| Функция деиницилизации                                                              |
//+-------------------------------------------------------------------------------------+
int deinit()
{
//----
   
//----
  return (0);
}
//+-------------------------------------------------------------------------------------+
//| Сигнализатор касания о луч                                                          |
//+-------------------------------------------------------------------------------------+
bool AlertByTouching(int signal)
{
   double priceDevBefore,
          priceDevAfter;
   
   if (signal == SIGNAL_SELL)
   {
      priceDevAfter = objPriceCurr + faustUs * pt;
      priceDevBefore = objPriceCurr - dernovich * pt;

      if (Bid <= priceDevAfter && Bid >= priceDevBefore)
      {
         Print("Внимание. На инструменте ", Symbol(), " ожидается 3-е касание луча. Готовься продавать!");
         Alert("Внимание. На инструменте ", Symbol(), " ожидается 3-е касание луча. Готовься продавать!");
         
         return (true);
      }
   }
   if (signal == SIGNAL_BUY)
   {
      priceDevAfter = objPriceCurr - faustUs * pt;
      priceDevBefore = objPriceCurr + dernovich * pt;
      Print("priceDevAfter = ", objPriceCurr - faustUs * pt);
      Print("priceDevBefore = ", objPriceCurr - faustUs * pt);
      Print("Ask >= priceDevAfter && Ask >= priceDevBefore ", Ask ," >= ", priceDevAfter ," && ", Ask ," >= ", priceDevBefore);
      if (Ask >= priceDevAfter && Ask >= priceDevBefore)
      {
         Print("Внимание. На инструменте ", Symbol(), " ожидается 3-е касание луча. Готовься покупать!");
         Alert("Внимание. На инструменте ", Symbol(), " ожидается 3-е касание луча. Готовься покупать!");
         
         return (true);
      }
   }
   return (false);
}
//+-------------------------------------------------------------------------------------+
//| Блок поиска своих объектов                                                          |
//+-------------------------------------------------------------------------------------+
bool GetSignal()
{
   if (!IsObjectFound())
      return (SIGNAL_NO);
   if (objPrice1 > objPrice2)
      return (SIGNAL_BUY);
   if (objPrice1 < objPrice2)
      return (SIGNAL_SELL);
}
//+-------------------------------------------------------------------------------------+
//| Блок поиска своих объектов                                                          |
//+-------------------------------------------------------------------------------------+
bool IsObjectFound()
{
   for (int obj=0; obj<=ObjectsTotal()-1; obj++)
   {
      objName = ObjectName(obj);
      isObj = ObjectFind(objName);
      objPrice1 = ObjectGet(objName, OBJPROP_PRICE1);
      objPrice2 = ObjectGet(objName, OBJPROP_PRICE2);
      objPriceCurr = ObjectGetValueByShift(objName,0);
   }
   Print("objPriceCurr = ", objPriceCurr);
      
      if (isObj != -1)  // Если объект найден, значит выходим из функции
         return (true);
         
   return (false); // Объект не найден
}
//+-------------------------------------------------------------------------------------+
//| Функция start                                                                       |
//+-------------------------------------------------------------------------------------+
int start()
{
   int signal = GetSignal();
   
   if (IsObjectFound() == false)
   {
      Print("В окне отсуствуют объекты, поиск продолжается...");
      return (0);
   }
   
   if (signal != SIGNAL_NO)
      if (!AlertByTouching(signal))
         return (0);
   
   Print("objPrice1 = ", objPrice1, ", objPrice2 = ", objPrice2);
  // Print("objPriceCurr = ", objPriceCurr);

  return (0);
}
isObjは int 型である。オブジェクトが存在する場合、そのオブジェクトが含まれるウィンドウを返します。存在しない場合は、-1を 返すと理解しています。ドキュメントによると、メインウィンドウが0から 始まり、サブウィンドウが...ということです。ここまでは、トレーディング用Expert Advisorの概要で、純粋なシグナルです。でも、好きなときにメッセージを出す。