Александр Богданов: こんにちは!MQL4は少し書きますが、MQL5が苦手です。その日の最高値と最安値の差を計算する小さなヘルパーが必要です。第4世代では、iHighとiLowという良い機能がありますが、ここにはありません。copyHighとcopyLowを使って みたのですが、最大値から最小値を引いた後にエラーが多発します。この問題を解決する方法を、できればコードスニペットで教えていただけませんか。ありがとうございました。
Александр Богданов: こんにちは!私はMQL4は少し書けますが、MQL5は全くのゼロです。その日の最高値と最安値の差を計算するための小さなヘルパーを書く必要があった。第4世代では、iHighとiLowという良い機能がありますが、ここにはありません。copyHighとcopyLowを使って みたのですが、最大値から最小値を引いた後にエラーが多発します。この問題を解決する方法を、できればコードスニペットで教えていただけませんか。ありがとうございました。
Александр Богданов: こんにちは!私はMQL4で少し文章を書いていますが、MQL5には慣れていません。その日の最高値と最安値の差を計算する小さなヘルパーが必要です。第4世代では、iHighとiLowという良い機能がありますが、ここにはありません。copyHighとcopyLowを使って みたのですが、最大値から最小値を引いた後にエラーが出続けてしまいます。この問題を解決する方法を、できればコードスニペットで教えていただけませんか。ありがとうございました。
Александр Богданов: こんにちは!MQL4で文章を書くことはあるのですが、MQL5は苦手です。その日の最高値と最安値の差を計算する小さなヘルパーが必要です。第4世代では、iHighとiLowという良い機能がありますが、ここにはありません。copyHighとcopyLowを使って みたのですが、最大値から最小値を引いた後にエラーが出続けてしまいます。この問題を解決する方法を、できればコードスニペットで教えていただけませんか。ありがとうございました。
もし、毎日の高値と安値(現在の日の高値と安値)を取得したい場合は、SymbolInfoDouble()に識別子 SYMBOL_BIDHIGH と SYMBOL_BIDLOW(or any other, as you may prefer) を付けて使用することができる。
こんにちは 2016.10.21_19:58 MSCです。ストラテジーテスターでEAを確認する。EAが動作し、取引を開始し、終了する。しかし、Strategy Testerでエラーが発生しました。ArrayMinimum関数の開始位置が0でない; -1; array out of range in 'CLose.mqh' (86,59); EAの重大なエラーのためテストパスを停止しました。Expert Advisorのスクリーンショットと、起動するファイルCLose.mqhのコードが表示されます。このコードでは、配列の外側にエラーは見当たりません。そのため、何がエラーなのかがわからないのです。できればアドバイスをお願いします。以上、今回はこの辺で。20:08 MSC
Николай Никитюк: こんにちは 2016.10.21_19:58 MSCです。ストラテジーテスターでアドバイザーを確認する。アドバイザーが働き、取引を開始し、終了する。しかし、Strategy Testerでエラーが発生しました。ArrayMinimum関数の開始位置が0でない; -1; array out of range in 'CLose.mqh' (86,59); EAの重大なエラーのためテストパスを停止しました。Expert Advisorのスクリーンショットと、起動するファイルCLose.mqhのコードが表示されます。このコードでは、配列の外側にエラーは見当たりません。そのため、何がエラーなのかがわからないのです。できればアドバイスをお願いします。以上、今回はこの辺で。20:08 MSC
ジグザグの頂点を求めるコードの一部を拝見しましたが、これはIgor Kimのものだと思います。ここでは、極限探索のコードに、極限を発見するまでの時間の短縮を追加で挿入しています。ループの中で探しているのか...。特定する際には、ループインデックスが指す時間を覚えておくと、すでに極値が特定されている場合、つまり、その価格の値を返す 前に特定することができます。つまり、ジグザグの極限を見つけたときの時間を書き込む関数に、datetime変数を参照で追加で渡す。この関数が価格の値を返すとき、この変数にはジグザグの極限が位置するバーの開始時刻の値が追加で書き込まれます。
申し訳ないのですが、仕事用のパソコンから離れているため、コード例を示すことができません。
こんにちは!MQL4は少し書きますが、MQL5が苦手です。その日の最高値と最安値の差を計算する小さなヘルパーが必要です。第4世代では、iHighとiLowという良い機能がありますが、ここにはありません。copyHighとcopyLowを使って みたのですが、最大値から最小値を引いた後にエラーが多発します。この問題を解決する方法を、できればコードスニペットで教えていただけませんか。ありがとうございました。
こんにちは!私はMQL4は少し書けますが、MQL5は全くのゼロです。その日の最高値と最安値の差を計算するための小さなヘルパーを書く必要があった。第4世代では、iHighとiLowという良い機能がありますが、ここにはありません。copyHighとcopyLowを使って みたのですが、最大値から最小値を引いた後にエラーが多発します。この問題を解決する方法を、できればコードスニペットで教えていただけませんか。ありがとうございました。
トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム
CopyTicks」のテスト
fxsaber, 2016.10.19 07:59
// А так же задает привычные MT4-функции: iOpen, iHigh, iLow, iClose, iTime, iVolume.
#define DEFINE_TIMESERIE(NAME,FUNC,T) \
class CLASS##NAME \
{ \
public: \
static T Get( const string Symb, const int TimeFrame, const int iShift ) \
{ \
T tValue[]; \
\
return((Copy##FUNC((Symb == NULL) ? _Symbol : Symb, _Period, iShift, 1, tValue) > 0) ? tValue[0] : -1); \
} \
\
T operator []( const int iPos ) const \
{ \
return(CLASS##NAME::Get(_Symbol, _Period, iPos)); \
} \
}; \
\
CLASS##NAME NAME; \
\
T i##NAME( const string Symb, const int TimeFrame, const int iShift ) \
{ \
return(CLASS##NAME::Get(Symb, TimeFrame, iShift)); \
}
DEFINE_TIMESERIE(Volume, TickVolume, long)
DEFINE_TIMESERIE(Time, Time, datetime)
DEFINE_TIMESERIE(Open, Open, double)
DEFINE_TIMESERIE(High, High, double)
DEFINE_TIMESERIE(Low, Low, double)
DEFINE_TIMESERIE(Close, Close, double)
コードの冒頭に次のように挿入します。
こんにちは!私はMQL4で少し文章を書いていますが、MQL5には慣れていません。その日の最高値と最安値の差を計算する小さなヘルパーが必要です。第4世代では、iHighとiLowという良い機能がありますが、ここにはありません。copyHighとcopyLowを使って みたのですが、最大値から最小値を引いた後にエラーが出続けてしまいます。この問題を解決する方法を、できればコードスニペットで教えていただけませんか。ありがとうございました。
画面に表示するだけのタスクであれば、インジケーターが最適解となる。OnCalculate()のインジケータには、必要な時系列がすべて含まれています。
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
MQL5のインジケーターでは、デフォルトで右端のバーがrates_total-1というインデックスを持っています。そして、あなたの課題は、初歩的な引き算に帰結します。
ただし、このシンプルな方法は、インジケータがD1タイムフレームで動作している場合にのみ、正しく表示されます。他のタイムフレームで実行する場合は、CopyHigh と CopyLow を使用する必要があります。
では、例を書きますね...。
//| High minus Low.mq5 |
//| Copyright © 2016, Vladimir Karputov |
//| http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2016, Vladimir Karputov"
#property link "http://wmua.ru/slesar/"
#property version "1.00"
#property indicator_chart_window
#property indicator_plots 0
//--- input parameter
input ENUM_TIMEFRAMES period=PERIOD_D1; // для какого периода считать High-Low
//---
double multiplier=0.0;
double High[],Low[];
//+------------------------------------------------------------------+
//| Custom indicator initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- indicator buffers mapping
multiplier=MathPow(10,Digits());
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Custom indicator iteration function |
//+------------------------------------------------------------------+
int OnCalculate(const int rates_total,
const int prev_calculated,
const datetime &time[],
const double &open[],
const double &high[],
const double &low[],
const double &close[],
const long &tick_volume[],
const long &volume[],
const int &spread[])
{
//--- разницу цен переводим в пункты
double difference=(iHigh(Symbol(),period,0)-iLow(Symbol(),period,0))*multiplier;
//--- вывод результата на экран
Comment("High-Low=",DoubleToString(difference,0));
//--- return value of prev_calculated for next call
return(rates_total);
}
//+------------------------------------------------------------------+
//| Получим Low для заданного номера бара |
//+------------------------------------------------------------------+
double iLow(string symbol,ENUM_TIMEFRAMES timeframe,int index)
{
double low=0;
ArraySetAsSeries(Low,true);
int copied=CopyLow(symbol,timeframe,0,Bars(symbol,timeframe),Low);
if(copied>0 && index<copied) low=Low[index];
return(low);
}
//+------------------------------------------------------------------+
//| Получим High для заданного номера бара |
//+------------------------------------------------------------------+
double iHigh(string symbol,ENUM_TIMEFRAMES timeframe,int index)
{
double high=0;
ArraySetAsSeries(High,true);
int copied=CopyHigh(symbol,timeframe,0,Bars(symbol,timeframe),High);
if(copied>0 && index<copied) high=High[index];
return(high);
}
//+------------------------------------------------------------------+
これで、現在のシンボルの任意の時間枠でインジケータを実行し、どの時間枠で高値と安値の差を計算するかを選択することができます。こんにちは!MQL4で文章を書くことはあるのですが、MQL5は苦手です。その日の最高値と最安値の差を計算する小さなヘルパーが必要です。第4世代では、iHighとiLowという良い機能がありますが、ここにはありません。copyHighとcopyLowを使って みたのですが、最大値から最小値を引いた後にエラーが出続けてしまいます。この問題を解決する方法を、できればコードスニペットで教えていただけませんか。ありがとうございました。
//| CLose.mqh |
//| Nickityuk N., 2016. |
//| https://www.mql5.com/users/nicityuk/ |
//+------------------------------------------------------------------+
#property copyright "Nickityuk N., 2016."
#property link "https://www.mql5.com/users/nicityuk/"
#property strict
#include <Expert\OPen.mqh>
//#include <ARrayMinimum.mqh>
double AOmax,AOmax2,AOmin,AOmin2,AOm0,AOn0,z5max0,z5min0,clm,cln,AO[];
int aom,aom2,aon,aon2;
datetime ttm,ttn,hm,hn;
//+------------------------------------------------------------------+
//| Calculate for close order |
//+------------------------------------------------------------------+
void CLose()
{if(buy==0 && sell==0) {return;}
else if(OrderType()==OP_BUY) {CloseBuy();}
else CloseSell();}
//+------------------------------------------------------------------+
void St()
{St0=iStochastic(NULL,0,24,5,3,MODE_SMA,0,MODE_MAIN,0);
Si0=iStochastic(NULL,0,24,5,3,MODE_SMA,0,MODE_SIGNAL,0);
St1=iStochastic(NULL,0,24,5,3,MODE_SMA,0,MODE_MAIN,1);
Si1=iStochastic(NULL,0,24,5,3,MODE_SMA,0,MODE_SIGNAL,1);}
void CloseBuy()
{St(); if(St0-20>0 && Si0-20>0)
{if(St1-Si1>0 && St0-Si0<0) {AOm0=iAO(NULL,0,0);
if(AOm0-AOm1>=0) {AOm1=iAO(NULL,0,0); return;}
else if(St0-80>0 && St0-100<=0 && Si0-80>0)
{if(Si0-100<=0 && St1-Si1>0 && St0-Si0<0)
{TwoExtremeAO_Buy(); OneExtremeBuy(); ExpirationBuy();}
else return;}
else return;}
else return;}
else return;}
void CloseSell()
{St(); if(St0-80<0 && Si0-80<0)
{if(St1-Si1<0 && St0-Si0>0) {AOn0=iAO(NULL,0,0);
if(AOn0-AOn1<=0) {AOn1=iAO(NULL,0,0); return;}
else if(St0-20<0 && St0>=0 && Si0-20<0)
{if(Si0>=0 && St1-Si1<0 && St0-Si0>0)
{TwoExtremeAO_Sell(); OneExtremeSell(); ExpirationSell();}
else return;}
else return;}
else return;}
else return;}
//+------------------------------------------------------------------+
void CalculateClose()
{v0=iVolume(NULL,PERIOD_M1,0); //--- go trading only for first tiks of new bar
v1=iVolume(NULL,PERIOD_M1,1);
v2=iVolume(NULL,PERIOD_M1,2);
v3=iVolume(NULL,PERIOD_M1,3);
v4=iVolume(NULL,PERIOD_M1,4);
if(v0+v1+v2+v3+v4-10/12>0) return;
for(index=0;index<24;index++)
{AO[index]=iAO(NULL,PERIOD_M5,index);}
ArrayResize(AO,24,4);
ArraySetAsSeries(AO,true);}
//index=0; AO[index]=iAO(NULL,PERIOD_M5,index);}
//+------------------------------------------------------------------+
void TwoExtremeAO_Buy()
{CalculateClose();
if(ArrayMaximum(AO,23,0)==0) return;
else aom=ArrayMaximum(AO,23,0); AOmax=AO[aom];
if(ArrayMinimum(AO,aom,0)>0) {aon=ArrayMinimum(AO,aom,0);}
else return;
if(ArrayMaximum(AO,aon,0)==0) return;
else aom2=ArrayMaximum(AO,aon,0); AOmax2=AO[aom2];
if(AOmax2-AOmax>0) {return;}
else if(AOmax2-AOmax<0) {if(OrderClose(OrderTicket(),OrderLots(),Bid,300,White)==false)
{Print("OrderClose error.",GetLastError());}
else //index=2;
//while(iFractals(NULL,0,MODE_UPPER,index)==0) {index++;}
//Sleep(3000); luf=iFractals(NULL,0,MODE_UPPER,index);
//SL=NormalizeDouble(luf+(Ask-Bid)+(1*_Point),_Digits);
TP=NormalizeDouble(Ask-tp*_Point,_Digits);
tic=OrderSend(Symbol(),OP_SELL,LotsCalculated(),Bid,50,0,TP,"",MAGIC,0,Red);
AOn1=iAO(NULL,0,index); return;}
else return;}
//+------------------------------------------------------------------+
void TwoExtremeAO_Sell()
{CalculateClose();
if(ArrayMinimum(AO,23,0)==0) return;
else aon=ArrayMinimum(AO,23,0); Print(aon,""); AOmin=AO[aon];
if(ArrayMaximum(AO,aon,0)>0) {aom=ArrayMaximum(AO,aon,0);}
else return;
if(ArrayMinimum(AO,aom,0)==0) return;
else aon2=ArrayMinimum(AO,aom,0); AOmin2=AO[aon2]; //Print(aon2,"");
if(AOmin2-AOmin>0) {return;}
else if(AOmin2-AOmin<0) {if(OrderClose(OrderTicket(),OrderLots(),Bid,300,White)==false)
{Print("OrderClose error.",GetLastError());}
else //index=2;
//while(iFractals(NULL,0,MODE_LOWER,index)==0) {index++;}
//Sleep(3000); ldf=iFractals(NULL,0,MODE_LOWER,index);
//SL=NormalizeDouble(ldf-(1*_Point),_Digits);
TP=NormalizeDouble(Bid+tp*_Point,_Digits);
tic=OrderSend(Symbol(),OP_BUY,LotsCalculated(),Ask,50,0,TP,"",MAGIC,0,Blue);
AOm1=iAO(NULL,0,0); return;}
else return;}
//+------------------------------------------------------------------+
void OneExtremeBuy()
{index=0;
while(iCustom(NULL,PERIOD_M5,"ZigZag",12,5,3,1,index)==0) {index++;}
z5max0=iCustom(NULL,PERIOD_M5,"ZigZag",12,5,3,1,index); ttm=iTime(NULL,0,index); clm=iClose(NULL,PERIOD_M5,0); //Sleep(3000);
if((clm-(z5max0-300*Point))<0) {if(OrderClose(OrderTicket(),OrderLots(),Bid,300,White)==false)
{Print("OrderClose error.",GetLastError());}
else return;}
else return;}
void OneExtremeSell()
{index=0;
while(iCustom(NULL,PERIOD_M5,"ZigZag",12,5,3,2,index)==0) {index++;}
z5min0=iCustom(NULL,PERIOD_M5,"ZigZag",12,5,3,2,index); ttn=iTime(NULL,0,index); cln=iClose(NULL,PERIOD_M5,0); //Sleep(3000);
if((cln-(z5min0+300*Point))>0) {if(OrderClose(OrderTicket(),OrderLots(),Bid,300,White)==false)
{Print("OrderClose error.",GetLastError());}
else return;}
else return;}
//+------------------------------------------------------------------+
void ExpirationBuy()
{hm=TimeHour(ttm); if((hm+3)-TimeCurrent()<0) {if(OrderClose(OrderTicket(),OrderLots(),Bid,300,White)==false)
{Print("OrderClose error.",GetLastError());}
else return;}
else return;}
void ExpirationSell()
{hn=TimeHour(ttn); if((hn+3)-TimeCurrent()<0) {if(OrderClose(OrderTicket(),OrderLots(),Bid,300,White)==false)
{Print("OrderClose error.",GetLastError());}
else return;}
else return;}
//+------------------------------------------------------------------+
こんにちは 2016.10.21_19:58 MSCです。ストラテジーテスターでアドバイザーを確認する。アドバイザーが働き、取引を開始し、終了する。しかし、Strategy Testerでエラーが発生しました。ArrayMinimum関数の開始位置が0でない; -1; array out of range in 'CLose.mqh' (86,59); EAの重大なエラーのためテストパスを停止しました。Expert Advisorのスクリーンショットと、起動するファイルCLose.mqhのコードが表示されます。このコードでは、配列の外側にエラーは見当たりません。そのため、何がエラーなのかがわからないのです。できればアドバイスをお願いします。以上、今回はこの辺で。20:08 MSC
これは、doubleのように見えて、結果がよくわからないので、intに変換(aon=NormalizeDouble(aon,0)で)できるのでしょうか?
:
EAに入力パラメータを入力するだけで、起動時に割り当てられた値に応じて、買いのみ、または売りのみとなります。
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
...
void OnTick()
{
if(!Long)
trade.Sell(0.01);
if(Long)
trade.Buy(0.01);
}