/+------------------------------------------------------------------------------------------+
//| ArrayGetAsSeries_плюс.mq4 |//+------------------------------------------------------------------------------------------+//| script program start function |//+------------------------------------------------------------------------------------------+//------------------------------------ НАЧАЛО START -------------------------------------- 1 -int start() //функция start
{ //начало startdouble 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 -
#property copyright "hoz"#property link ""#include <stderror.mqh>#include <stdlib.mqh>externstring h1 = "основные параметры машки";
externint i_maTF = 0;
externint i_maPeriod = 50;
externint i_maShiftByPrice = 0;
externint i_maMethod = 0;
externint i_maPrice = 0;
externint i_shiftBarsBack1 = 1; // Первое значение shiftexternint i_shiftBarsBack2 = 49; // Второе значение shiftexternstring 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);
}
// -------------- блок деинициализации закончен ---------------------- */
//---- 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); //---торговля по шортам
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); // Цена в точке В
いや、あくまでもデータが歴史の一コマと一致したということだ。
手動で入力するなどの方法があったはずです。またはテキストファイルから書き込む。あるいは、電卓から取得することもできたはずです。
なぜなら、「1.25 1.16 1.73 1.35」という条件付きデータを入力しても、何年も前のある通貨の履歴が得られるかもしれないからです。しかし、だからといって、配列のタイムスリップを設定したわけではありません
オリジナルの脚本に少し手を加えた。
1.最後の始値5個だけをカスタム配列にコピーしました。
2.取得したカスタム配列をコピーした5つの始値すべてで計算した。
以下、入手したものを紹介します。
図からわかるように、建値は逆順にインデックスされており(建値の数(昇順)、建値の時間(降順)からもわかるように)、つまり配列は配列-時系列として構成されていることがわかります。
しかし、ArrayGetAsSeries関数は0(false)を返すので、ユーザー配列は配列-時系列として構成されていないことを意味します。
非常に親切に分かりやすく教えてくれる
質問:これはどう説明できるのでしょうか?
追伸:質問にお答えいただきありがとうございました。
オリジナルの脚本に少し手を加えた。
1.過去5回の始値だけをカスタム配列にコピーしました。
2.Rasprocessは、得られたカスタム配列をコピーされた5つの始値すべてで処理しました。
以下、入手したものを紹介します。
図からわかるように、建値は逆順にインデックスされており(建値の数(昇順)、建値の時間(降順)からもわかるように)、つまり配列は配列-時系列として構成されていることがわかります。
しかし、ArrayGetAsSeries関数は0(false)を返すので、ユーザー配列は配列-時系列として構成されていないことを意味します。
明確にすること
質問:どのように説明するのですか?
P.S. 私の質問に答えてくれてありがとう。
を試されましたか?
機能を試されましたか?
i_maTF == Period() ?・・・・・・・・・?
i_maPeriodが妥当な値を取る?
もしかしたら、i_maShiftByPriceに何か問題があるのかもしれません。
もっと正確に言うと、難しいんです。
出力される情報が正しくない。以下は、そのコードの全容です。
Expert Advisorのログには、このように表示されています。
見ての通り、i_maTF, i_maPeriod,i_maPriceの 各変数は私が初期化したものではありません。どうしたんですか?
誤った情報を出力する。以下は、そのコードの全容です。
Expertのログを見ると、このように表示されています。
見ての通り、変数i_maTF, i_maPeriod,i_maPriceが 初期化したものと違っていますね。どうしたんですか?
提出したコードがコンパイルされないのに、どうやってログに何かを残したんだろう?
あ、コンパイルすれば変なことにならないか。
提示されたコードがコンパイルされないのに、どうやってログに何かを書き込んだのでしょう?
あ、コンパイルすれば変なことになりませんよ。
いつも普通にコンパイルしています。
誰かを混乱させないように、余分なプリンターや変数を取り除いたコードにしました。でも、以下は削除していないので、コンパイルできませんでした。以下は、コンパイルするコードの全文です。
助けてください!EAで新しい注文を出すときに、古い注文を閉じるようにするには?Strategy Testerでは問題なく動作するのですが、リアル口座ではなぜか新しいものを開くと古いものが出て行ってしまうのです?私はプログラミングは全くの0点です((
//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を作成することもできます。本当に、本当に必要なヘルプ!!!
助けてください!EAで新しい注文を出すときに、古い注文を閉じるようにするには?Strategy Testerでは問題なく動作するのですが、リアル口座ではなぜか新しいものを開くと古いものが出て行ってしまうのです?プログラミングのことは全くわかりません((!
//ooooooooooooooooooooooooooooooooooooooooooooooooo
extern bool In_BUY=true;
extern int SL_buy=62; //---входные параметры по лонгам
extern int Risk_buy=0;
交換
まで
この段階での私の目標は、この関数やあの関数がどのように動作するのか、この特定のケースでは、ArrayGetAsSeries関数がどのように動作するのかを理解することです。ArraySetAsSeries 関数のパラメータset=trueで、array-timeseriesのように強制的にインデックスを設定 することができると理解しています。しかし、私の場合 、配列が時系列に見える(つまり時系列のようにインデックスされている)にもかかわらず、関数 ArrayGetAsSeriesが0を返した理由を理解したいのです。
正確には、時系列としてEXPLAINSしているだけだからです。
これはあくまで個人的な意見です。そして、そこに1、2、1.2、2.1という数字を入れると、1927年からの豚肉の時系列ができあがります(数字は条件付きです)。しかし、これでは配列が時系列にならないので、明示的に関数
提示されたコードがコンパイルされないのに、どうやってログに何かを書き込んだのでしょう?
あ、コンパイルすれば変なことになりませんよ。
上にオリジナル版をあげましたが、これはもちろんコンパイルできます。質問があります。なぜラインを交換したのですか。
i_maTF からPeriod().私が間違っているのでしょうか?
ドキュメントには、 移動平均を 計算する際に、次のように書かれています。
タイムフレーム、すなわち、私の変数i_maTF( Period.チャート期間のいずれかとすることができる。0は現在のグラフの周期を意味します。i_maPeriodの 記載がない ため)0を指定して いました。はっきりさせてください!