[ARCHIVE!] フォーラムを散らかさないように、どんなルーキーの質問でも。プロフェッショナルは、通り過ぎないでください。あなたなしではどこにも行けない - 4. - ページ 449

[Удален]  
ilunga:

いや、あくまでもデータが歴史の一コマと一致したということだ。

手動で入力するなどの方法があったはずです。またはテキストファイルから書き込む。あるいは、電卓から取得することもできたはずです。


なぜなら、「1.25 1.16 1.73 1.35」という条件付きデータを入力しても、何年も前のある通貨の履歴が得られるかもしれないからです。しかし、だからといって、配列のタイムスリップを設定したわけではありません

オリジナルの脚本に少し手を加えた。

1.最後の始値5個だけをカスタム配列にコピーしました。

2.取得したカスタム配列をコピーした5つの始値すべてで計算した。

/+------------------------------------------------------------------------------------------+
//|                                                                ArrayGetAsSeries_плюс.mq4 |
//+------------------------------------------------------------------------------------------+
//|                         script program start function                                    |
//+------------------------------------------------------------------------------------------+
//------------------------------------ НАЧАЛО START -------------------------------------- 1 -
int start()                                           //функция start
  {                                                   //начало start
   double Timestart=GetTickCount();                   //переменная, с помощью которой вычисляется время (в милисекундах) начала выполнения эксперта 
   double array1[];                                   //объявляем массив-приемник (массив, куда будут скопированы данные)
   int element=ArrayCopy(array1,Open,0,0,5);          //копируем данные по максимальным ценам в пользовательский массив (начиная с 1-о бара, а не с нулевого)
   int size=ArraySize(array1);                        //устанавливаем количество элементов массива array1
//----------------------------------------------------------------------------------------- 2 -
   Comment("\nФункция ArrayCopy(array1[],Open,0,0,WHOLE_ARRAY) вернула: ",element,
           "\nФункция ArraySize(array1) вернула: ",size,
           "\nЗначение цены открытия бара №0 равно ",array1[0],"; Время цены открытия бара №0: ",TimeToStr(iTime(NULL,0,0),TIME_DATE|TIME_MINUTES),
           "\nЗначение цены открытия бара №1 равно ",array1[1],"; Время цены открытия бара №1: ",TimeToStr(iTime(NULL,0,1),TIME_DATE|TIME_MINUTES),
           "\nЗначение цены открытия бара №2 равно ",array1[2],"; Время цены открытия бара №2: ",TimeToStr(iTime(NULL,0,2),TIME_DATE|TIME_MINUTES),
           "\nЗначение цены открытия бара №3 равно ",array1[3],"; Время цены открытия бара №3: ",TimeToStr(iTime(NULL,0,3),TIME_DATE|TIME_MINUTES),
           "\nЗначение цены открытия бара №4 равно ",array1[4],"; Время цены открытия бара №4: ",TimeToStr(iTime(NULL,0,4),TIME_DATE|TIME_MINUTES),
           "\nФункция ArrayGetAsSeries(array1) вернула: ",ArrayGetAsSeries(array1),
           "\nСкрипт выполнялся всего ",GetTickCount()-Timestart," миллисекунд, из них: ",MathFloor((GetTickCount()-Timestart)/1000),
           " секунд ",((GetTickCount()-Timestart)/1000-MathFloor((GetTickCount()-Timestart)/1000))*1000," миллисекунд");//печать 
           //сообщения на экран
//----------------------------------------------------------------------------------------- 3 -
   return(0);                                                             //выход из start
  }                                                                       //конец start
//-------------------------------------- КОНЕЦ START -------------------------------------- 4 -

以下、入手したものを紹介します。


図からわかるように、建値は逆順にインデックスされており(建値の数(昇順)、建値の時間(降順)からもわかるように)、つまり配列は配列-時系列として構成されていることがわかります。

しかし、ArrayGetAsSeries関数は0(false)を返すので、ユーザー配列は配列-時系列として構成されていないことを意味します。

非常に親切に分かりやすく教えてくれる

質問:これはどう説明できるのでしょうか?

追伸:質問にお答えいただきありがとうございました。

 
7777877:

オリジナルの脚本に少し手を加えた。

1.過去5回の始値だけをカスタム配列にコピーしました。

2.Rasprocessは、得られたカスタム配列をコピーされた5つの始値すべてで処理しました。

以下、入手したものを紹介します。

図からわかるように、建値は逆順にインデックスされており(建値の数(昇順)、建値の時間(降順)からもわかるように)、つまり配列は配列-時系列として構成されていることがわかります。

しかし、ArrayGetAsSeries関数は0(false)を返すので、ユーザー配列は配列-時系列として構成されていないことを意味します。

明確にすること

質問:どのように説明するのですか?

P.S. 私の質問に答えてくれてありがとう。

を試されましたか?

boolArraySetAsSeries()void array[], bool set)
配列のインデックス方向を設定します。TRUE を指定すると、インデックスの方向を逆順に、つまり最後の要素のインデックスが 0 になるように設定します。FALSE を指定すると、通常のインデックス作成方向が設定されます。この関数は、直前の状態を返します。
パラメータ
array[]-設定する数値配列。
鏤める-配列のインデックスを作成する方向。
[Удален]  
Vinin:

機能を試されましたか?

boolArraySetAsSeries()void array[], bool set)
配列のインデックス方向を設定します。TRUEを設定するとインデックスの方向を逆順にする,つまり最後の要素のインデックスを0に する。FALSE を指定すると、通常のインデックス作成方向が設定されます。この関数は、直前の状態を返します。
パラメータ
array[]-設定する数値配列。
鏤める-配列のインデックスを作成する方向。

この段階での私の目標は、特定の関数がどのように機能するか、この特定のケースでは、ArrayGetAsSeries関数が どのように機能するかを理解することです。ArraySetAsSeries 関数のパラメータset=trueで、array-timeseriesのように強制的にインデックスを設定 することができると理解しています。しかし、私の場合 配列が時系列に見える(つまり時系列のようにインデックスされている)にもかかわらず関数 ArrayGetAsSeriesが0を返した理由を理解したいのです。
 
Sepulca:


i_maTF == Period() ?・・・・・・・・・?

i_maPeriodが妥当な値を取る?

もしかしたら、i_maShiftByPriceに何か問題があるのかもしれません。

もっと正確に言うと、難しいんです。

出力される情報が正しくない。以下は、そのコードの全容です。

#property copyright "hoz"
#property link      ""
#include <stderror.mqh>
#include <stdlib.mqh>

extern string  h1 = "основные параметры машки";
extern int     i_maTF = 0;
extern int     i_maPeriod = 50;
extern int     i_maShiftByPrice = 0;
extern int     i_maMethod = 0;
extern int     i_maPrice = 0;
extern int     i_shiftBarsBack1 = 1;                        // Первое значение shift
extern int     i_shiftBarsBack2 = 49;                       // Второе значение shift
extern string  h2 = "===============================";

string         h3 = "Значения цены и времени в точках А и В гипотенузы";
double         price1,                                      // Цена в точке А
               price2,                                      // Цена в точке В
               time1,                                       // Время в точке А
               time2,                                       // Время в точке В
string         h4 = "Переменые массивов цены и времени в точках А и В гипотенузы";
double         varsPrice1[100],                             // Буфер для цены в точке А
               varsPrice2[100],                             // Буфер для цены в точке В
               varsTime1[100],                              // Буфер для времени в точке А
               varsTime2[100],                              // Буфер для времени в точке В

#property indicator_separate_window
#property indicator_buffers 5
#property indicator_color1 Red
//+------------------------------------------------------------------+
//|               Функция инициализации индикатора                   |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
   SetIndexBuffer(0,varsAngle);                          // Связываем массив значений угла с буфером
   SetIndexStyle(0,DRAW_HISTOGRAM); 
   
// -------------- блок инициализации закончен ----------------------
   return(0);
  }
//+------------------------------------------------------------------+
//|              Функция деинициализации индикатора                  |
//+------------------------------------------------------------------+
int deinit()
  {

// -------------- блок деинициализации закончен ----------------------
   return(0);
  }
//+------------------------------------------------------------------+
//|                  Функция итерации эксперта                       |
//+------------------------------------------------------------------+
int start()
  {
   int i, countedBars = IndicatorCounted();
   int limit = Bars - countedBars;
   if (limit > 100) limit = 100;
        
   for(i = limit - 1;i > 0;i--)
    {
      price1 = iMA(Symbol(),i_maTF,i_maPeriod,i_maShiftByPrice,i_maMethod,i_maPrice,i_shiftBarsBack1+i);       // Цена в точке А
      price2 = iMA(Symbol(),i_maTF,i_maPeriod,i_maShiftByPrice,i_maMethod,i_maPrice,i_shiftBarsBack2+i);       // Цена в точке В
      time1 = iTime(Symbol(),Period(),i_shiftBarsBack1 + i - 1);                                               // Время в точке А
      time2 = iTime(Symbol(),Period(),i_shiftBarsBack2 + i - 1);                                               // Время в точке В
    
      Print("i = ", i," i_maTF = ", i_maTF, " i_maPeriod = ", i_maPeriod," i_maShiftByPrice ", i_maShiftByPrice, " i_maMethod = ", i_maMethod," i_maPrice = ", i_maPrice, " i_shiftBarsBack1 = ", i_shiftBarsBack1);
      string error = GetMyLastError2();
      
  //    Print("vars", DoubleToStr(price1,5));
    //  Print("vars", DoubleToStr(varsPrice1[i],5));
      
      varsPrice1[i] = price1;                                                                        // Массив цен в точке А
      varsPrice2[i] = price2;                                                                        // Массив цен в точке В
      varsTime1[i] = time1;                                                                          // Массив времени в точке А
      varsTime2[i] = time2;                                                                          // Массив времени в точке В
    
   
  //    Print("vars", DoubleToStr(varsPrice1[i],5));

            
      double d = (MathAbs(varsTime1[i] - varsTime2[i]))*1.0;
      double h = (MathAbs(varsPrice1[i] - varsPrice2[i]));
      
  //    Print("d = ", d, " h = ", h);
      
      double angle = h/d;
      varsAngle[i] = angle;
    }
   return(0);
  }
  
string GetMyLastError2()
  {
    int err = GetLastError();
    string serr = ErrorDescription(err);
    return(serr);
  }

/* //+------------------------------------------------------------------+
//|                  Функция рассчёта тангенса угла                  |
//+------------------------------------------------------------------+
double TanA(double d, double h)
 {
   double angle = h/d;
   
  return(0);
 }
// -------------- блок деинициализации закончен ---------------------- */

Expert Advisorのログには、このように表示されています。







14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 25 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 24 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 23 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 22 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 21 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 20 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 19 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 18 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 17 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 16 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 15 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 14 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 13 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 12 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 11 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 10 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 9 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 8 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 7 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 6 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 5 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 4 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 3 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 2 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7
14:50:36 2010.08.11 12:30  AngleByTg GBPUSD,M15: i = 1 i_maTF = 50 i_maPeriod = 0 i_maShiftByPrice 0 i_maMethod = 0 i_maPrice = 2 i_shiftBarsBack1 = 7

見ての通り、i_maTF, i_maPeriod,i_maPriceの 各変数は私が初期化したものではありません。どうしたんですか?

 
hoz:

誤った情報を出力する。以下は、そのコードの全容です。

Expertのログを見ると、このように表示されています。

見ての通り、変数i_maTF, i_maPeriod,i_maPriceが 初期化したものと違っていますね。どうしたんですか?

提出したコードがコンパイルされないのに、どうやってログに何かを残したんだろう?

あ、コンパイルすれば変なことにならないか。

ファイル:
hoz_1.mq4  4 kb
 
TarasBY:

提示されたコードがコンパイルされないのに、どうやってログに何かを書き込んだのでしょう?

あ、コンパイルすれば変なことになりませんよ。

いつも普通にコンパイルしています。

誰かを混乱させないように、余分なプリンターや変数を取り除いたコードにしました。でも、以下は削除していないので、コンパイルできませんでした。以下は、コンパイルするコードの全文です。

//+------------------------------------------------------------------+
//|                                                    AngleByTg.mq4 |
//|                                                              hoz |
//|                                                                  |
//+------------------------------------------------------------------+
#property copyright "hoz"
#property link      ""
#include <stderror.mqh>
#include <stdlib.mqh>

extern string  h1 = "основные параметры машки";
extern int     i_maTF = 0;
extern int     i_maPeriod = 50;
extern int     i_maShiftByPrice = 0;
extern int     i_maMethod = 0;
extern int     i_maPrice = 0;
extern int     i_shiftBarsBack1 = 1;                        // Первое значение shift
extern int     i_shiftBarsBack2 = 49;                       // Второе значение shift
extern string  h2 = "===============================";

string         h3 = "Значения цены и времени в точках А и В гипотенузы";
double         price1,                                      // Цена в точке А
               price2,                                      // Цена в точке В
               time1,                                       // Время в точке А
               time2,                                       // Время в точке В
               angle;                                       // Значение возвращаемой тангенсом
string         h4 = "Переменые массивов цены и времени в точках А и В гипотенузы";
double         varsPrice1[100],                             // Буфер для цены в точке А
               varsPrice2[100],                             // Буфер для цены в точке В
               varsTime1[100],                              // Буфер для времени в точке А
               varsTime2[100],                              // Буфер для времени в точке В
               varsAngle[100];                              // Буфер для хранения значение угла

#property indicator_separate_window
#property indicator_buffers 5
#property indicator_color1 Red
//#property indicator_minimum -90
//#property indicator_maximum 90
//+------------------------------------------------------------------+
//|               Функция инициализации индикатора                   |
//+------------------------------------------------------------------+
int init()
  {
   IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));
   SetIndexBuffer(0,varsAngle);                          // Связываем массив значений угла с буфером
   SetIndexStyle(0,DRAW_HISTOGRAM); 
   
// -------------- блок инициализации закончен ----------------------
   return(0);
  }
//+------------------------------------------------------------------+
//|              Функция деинициализации индикатора                  |
//+------------------------------------------------------------------+
int deinit()
  {

// -------------- блок деинициализации закончен ----------------------
   return(0);
  }
//+------------------------------------------------------------------+
//|                  Функция итерации эксперта                       |
//+------------------------------------------------------------------+
int start()
  {
 //   if (!isNewBar())
 //   return(0);
    
   int i, countedBars = IndicatorCounted();
   int limit = Bars - countedBars;
   if (limit > 100) limit = 100;
        
   for(i = limit - 1;i > 0;i--)
    {
      price1 = iMA(Symbol(),i_maTF,i_maPeriod,i_maShiftByPrice,i_maMethod,i_maPrice,i_shiftBarsBack1+i);       // Цена в точке А
      price2 = iMA(Symbol(),i_maTF,i_maPeriod,i_maShiftByPrice,i_maMethod,i_maPrice,i_shiftBarsBack2+i);       // Цена в точке В
      time1 = iTime(Symbol(),Period(),i_shiftBarsBack1 + i - 1);                                               // Время в точке А
      time2 = iTime(Symbol(),Period(),i_shiftBarsBack2 + i - 1);                                               // Время в точке В
    
      Print("i = ", i," i_maTF = ", i_maTF, " i_maPeriod = ", i_maPeriod," i_maShiftByPrice ", i_maShiftByPrice, " i_maMethod = ", i_maMethod," i_maPrice = ", i_maPrice, " i_shiftBarsBack1 = ", i_shiftBarsBack1);
      string error = GetMyLastError2();
      
      
//      Print("i = ", i," time1 = ", time1, " price1 = ", price1);
  //    Print("vars", DoubleToStr(price1,5));
    //  Print("vars", DoubleToStr(varsPrice1[i],5));
      
      varsPrice1[i] = price1;                                                                        // Массив цен в точке А
      varsPrice2[i] = price2;                                                                        // Массив цен в точке В
      varsTime1[i] = time1;                                                                          // Массив времени в точке А
      varsTime2[i] = time2;                                                                          // Массив времени в точке В
    
   
  //    Print("vars", DoubleToStr(varsPrice1[i],5));
    
      //Print("i = ", i," time1 = ", time1, " price1 = ", price1);
    //  Print("i = ", i," time2 = ", time2, " price2 = ", price2);
  //    Print("i = ", i," varsTime1[i] = ", varsTime1[i], " varsPrice1[i] = ", varsPrice1[i]);
     // Print("i = ", i," varsTime2[i] = ", varsTime2[i], " varsPrice2[i] = ", varsPrice2[i]);
            
      double d = (MathAbs(varsTime1[i] - varsTime2[i]))*1.0;
      double h = (MathAbs(varsPrice1[i] - varsPrice2[i]));
      
  //    Print("d = ", d, " h = ", h);
      
      double angle = h/d;
      varsAngle[i] = angle;
      
 //     Print("i = ", i," varsAngle[i] = ", varsAngle[i]);
    }
   return(0);
  }
  
string GetMyLastError2()
  {
    int err = GetLastError();
    string serr = ErrorDescription(err);
    return(serr);
  }

/* //+------------------------------------------------------------------+
//|                  Функция рассчёта тангенса угла                  |
//+------------------------------------------------------------------+
double TanA(double d, double h)
 {
   double angle = h/d;
   
  return(0);
 }
// -------------- блок деинициализации закончен ---------------------- */
ファイル:
anglebytg.mq4  6 kb
削除済み  

助けてください!EAで新しい注文を出すときに、古い注文を閉じるようにするには?Strategy Testerでは問題なく動作するのですが、リアル口座ではなぜか新しいものを開くと古いものが出て行ってしまうのです?私はプログラミングは全くの0点です((

//---- input parameters
//ooooooooooooooooooooooooooooooooooooooooooooooooo
extern bool In_BUY=true;
extern int SL_buy=62; //---входные параметры по лонгам
extern int Risk_buy=0;
//ooooooooooooooooooooooooooooooooooooooooooooooooo
extern bool In_SELL=true;
extern int SL_sell=62; //---входные параметры по шортам
extern int Risk_sell=0;
//ooooooooooooooooooooooooooooooooooooooooooooooooo

//---- other parameters
static int prevtime=0;
int ticket=0;
int x=1;
//----------------------------------------------
int Magic_BUY =123;
int Magic_SELL =321;


//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
if(Digits == 5) x=10;
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----

//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
//oooooooooooooooooooooooooooooooooooooooooooooooooooo
if (Time[0] == prevtime) return(0);
prevtime = Time[0];
if (!IsTradeAllowed()) {
prevtime=Time[1]; MathSrand(TimeCurrent());Sleep(30000 + MathRand()); //--- формировка бара---
}
//ooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO


Trade( Magic_BUY, In_BUY,Ask,0,2, SL_buy, Risk_buy); //---торговля по лонгам


Trade(Magic_SELL,In_SELL,Bid,2,0, SL_sell,Risk_sell); //---торговля по шортам


//ooooooooooooooooooooooooooooooooooooooooooooooooooooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
return(0);//-----------выход из стартовой функции------------
}
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
void Trade(int mn,bool flag,double price,int period_1,int period_2,int sl,int Risk) {

int total=OrdersTotal();

for (int i = 0; i < total; i++) { OrderSelect(i, SELECT_BY_POS, MODE_TRADES);//---проход по ордерам--


if (OrderSymbol() == Symbol() && OrderMagicNumber() == mn) {

if(Open[period_2]>Open[period_1]) { //----условие закрытия ордера---------

OrderClose(OrderTicket(),OrderLots(),price,5*x); RefreshRates();

}

return(0);
}
}

//ooooooooooooooooooooooooooooooooooooooooooooooooooo
ticket = -1;



if ( flag &&

Open[period_1]>Open[period_2] && //----вход в рынок по условию---


OrdersTotal()<2 && //-----ограничения чемпионата------

AccountEquity()>200 &&

IsTradeAllowed()) {

if (mn<200) {

ticket= OrderSend(Symbol(), OP_BUY,lot(Risk_buy),Ask,5,Bid-x*sl*Point,0,DoubleToStr(mn,0),mn,0,Blue);


}


else {

ticket= OrderSend(Symbol(),OP_SELL,lot(Risk_sell),Bid,5,Ask+x*sl*Point,0,DoubleToStr(mn,0),mn,0, Red);

}


RefreshRates();

if ( ticket < 0) { Sleep(30000); prevtime = Time[1]; }

} //-- Exit ---

return(0); }


//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
double lot(int R) { if (R<0)R=0; if (R>80)R=80; //------корректность ввода -------
double minlot = MarketInfo(Symbol(), MODE_MINLOT);
int o = MathAbs(MathLog(minlot) *0.4343) + 0.5;
double lot = minlot;
//ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
lot = NormalizeDouble(AccountFreeMargin() * 0.00001*R, o);//---
if (AccountFreeMargin() < lot * MarketInfo(Symbol(), MODE_MARGINREQUIRED)) {
lot = NormalizeDouble(AccountFreeMargin() / MarketInfo(Symbol(), MODE_MARGINREQUIRED), o);
}
//ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo
if(lot < minlot) lot = minlot;
double maxlot =MarketInfo(Symbol(), MODE_MAXLOT);
if(lot > maxlot) lot = maxlot;
return(lot); }
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx_end_film_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

あるいは、1が開いた、2が開いた-1が閉じた、3が開いた-2が閉じた、などの原則で動作する別のEAを作成することもできます。本当に、本当に必要なヘルプ!!!
 
al7bar:

助けてください!EAで新しい注文を出すときに、古い注文を閉じるようにするには?Strategy Testerでは問題なく動作するのですが、リアル口座ではなぜか新しいものを開くと古いものが出て行ってしまうのです?プログラミングのことは全くわかりません((!

//---- input parameters
//ooooooooooooooooooooooooooooooooooooooooooooooooo
extern bool In_BUY=true;
extern int SL_buy=62; //---входные параметры по лонгам
extern int Risk_buy=0;

交換

if(Open[period_2]>Open[period_1]) { //----условие закрытия ордера---------

 OrderClose(OrderTicket(),OrderLots(),price,5*x); RefreshRates(); 

 }

まで

if(Open[period_2]>Open[period_1]) { //----условие закрытия ордера---------

 OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),5*x); RefreshRates(); 

 }
 
7777877:
この段階での私の目標は、この関数やあの関数がどのように動作するのか、この特定のケースでは、ArrayGetAsSeries関数がどのように動作するのかを理解することです。ArraySetAsSeries 関数のパラメータset=trueで、array-timeseriesのように強制的にインデックスを設定 することができると理解しています。しかし、私の場合 配列が時系列に見える(つまり時系列のようにインデックスされている)にもかかわらず関数 ArrayGetAsSeriesが0を返した理由を理解したいのです。

正確には、時系列としてEXPLAINSしているだけだからです。

これはあくまで個人的な意見です。そして、そこに1、2、1.2、2.1という数字を入れると、1927年からの豚肉の時系列ができあがります(数字は条件付きです)。しかし、これでは配列が時系列にならないので、明示的に関数

 
TarasBY:

提示されたコードがコンパイルされないのに、どうやってログに何かを書き込んだのでしょう?

あ、コンパイルすれば変なことになりませんよ。

上にオリジナル版をあげましたが、これはもちろんコンパイルできます。質問があります。なぜラインを交換したのですか。

      price1 = iMA(Symbol(),i_maTF,i_maPeriod,i_maShiftByPrice,i_maMethod,i_maPrice,i_shiftBarsBack1+i);       // Цена в точке А
      price2 = iMA(Symbol(),i_maTF,i_maPeriod,i_maShiftByPrice,i_maMethod,i_maPrice,i_shiftBarsBack2+i);       // Цена в точке В

i_maTF からPeriod().私が間違っているのでしょうか?

ドキュメントには、 移動平均を 計算する際に、次のように書かれています。

double iMA( string symbol, int timeframe, int period, int ma_shift, int ma_method, int applied_price, int shift)

タイムフレーム、すなわち、私の変数i_maTF Period.チャート期間のいずれかとすることができる。0は現在のグラフの周期を意味します。i_maPeriodの 記載がない ため)0を指定して いました。はっきりさせてください!