MQL 4に関するプログラマーへの質問と回答 - ページ 4

 

今のところ、こんな感じです。

//+------------------------------------------------------------------+

| フィボ・トレーディング.mq4 | フィボ・トレーディング.mq4

//| ミノディ|

//| minodi@yandex.ru |

//+------------------------------------------------------------------+

#property copyright"Minodi(ミノディ)"

#プロパティリンク "minodi@yandex.ru"


extern int period_EMA = 233,

period_SMA = 233,

ストップロス=30

extern double Lot = 0.01;

extern string SesEnd ="22:00"; //Hai or Lowの境界時間

//+------------------------------------------------------------------+

//| スクリプトプログラム起動機能

//+------------------------------------------------------------------+

int start()

{

//------- 日足、Fibs、Hi-Lowのレンダリング時間----------------+。

int shift = iBarShift(NULL,1440,Time[0]) + 1;

double HiPrice = iHigh(NULL,1440,shift); //高値の場合

double LoPrice = iLow(NULL,1440,shift); // 安価な価格

double OpPrice = iOpen (NULL,1440,shift); //オープン価格

double ClPrice = iClose (NULL,1440,shift); // 終値。

datetime StTime = iTime(NULL,1440,shift); // ?

if(TimeDayOfWeek(StTime)==0/*Sunday*/)

{金曜日の高値・安値の追加

HiPrice = MathMax(HiPrice,iHigh(NULL,1440,shift+1));

LoPrice = MathMin(LoPrice,iLow(NULL,1440,shift+1));

OpPrice = iOpen(NULL,1440,shift+1);

ClPrice = iClose (NULL,1440,shift+1)です。

}

double Pivot =(HiPrice+LoPrice+ClPrice)/3;

Double Range =HiPrice-LoPrice;

double Fibo138 =1.382*Range+LoPrice;

double Fibo162 =1.618*Range+LoPrice;

double Fibo_138 =LoPrice-(1.382*Range-Range);

double Fibo_162 =LoPrice-(1.618*Range-Range);

//---------------- HiTimeとLow-----------------------------------------------------+。

int HiTime,LoTime;

int time; // 次のバーで値をロールバックする。


if (time!=Time[0]){HiTime=0;LoTime=0;time=Time[0];}.

if (High[0]>HiPrice)HiTime=TimeCurrent()。

if (Low[0]<LoPrice)LoTime=TimeCurrent();


Comment("このバーでは、"+"ⅳ時間高値="+HiTime+"ⅳ時間低値="+LoTime");

//-----------------Ценовой диапазон Демарка-------------------------------+

int currDay, i=0; //

if (currDay!=TimeDay(Time[i]))

{

if (ClPrice<OpPrice) double x=(HiPrice + LoPrice + LoPrice)/2;

if (ClPrice>OpPrice) x=(HiPrice + LoPrice + ClPrice + HiPrice)/2;

if (ClPrice==OpPrice) x=(HiPrice + LoPrice + ClPrice + ClPrice)/2;

i++;

}

double MaxDay = x - LoPrice; // デマークの価格帯

double MinDay = x - HiPrice; // デマークの価格範囲

// -----------Скользящие средние---------------------------------------------+

double EMA = iMA(15,0,period_EMA,0,MODE_EMA, PRICE_CLOSE,0)。

double SMA = iMA(15,0,period_SMA,0,MODE_SMA,PRICE_CLOSE,0);

double EMA1 = iMA(60,0,period_EMA,0,MODE_EMA,PRICE_CLOSE,0);

double SMA1 = iMA(60,0,period_SMA,0,MODE_SMA,PRICE_CLOSE,0);

//----------------Удаление вчерашних ордеров---------------------------------+

//------------------Ордера----------------------------------------------------+

 

フォーラムメンバーの皆様、コードをチェックしてください、私は徐々に追加する予定です。

 

これらは私が与えたパラメータです、始める前に配置してください


int HiTime,LoTime;

int time; // на следующем баре обнкляем значения

 
プログラマーの 皆さん、こんにちは。初心者に、取引注文を出すと同時にトレーリングストップ 機能を最低限有効にするスクリプト(Expert Advisorではない)の書き方をアドバイスしていただけませんか?もしかしたら既製品があるかもしれないので、その時はリンクを教えてください。
 
Vladon >>:

Вот эти параметры ято я давал, поместите перд стартом


int HiTime,LoTime;

int time; // на следующем баре обнкляем значения


移動した。他は問題ないですか?
 

フォーラムメンバーの皆さん、注意して、どんな間違いがあったのか教えてください。

//+------------------------------------------------------------------+

| フィボ・トレーディング.mq4 | フィボ・トレーディング.mq4

//| ミノディ|

//| minodi@yandex.ru |

//+------------------------------------------------------------------+

#property copyright"Minodi(ミノディ)"

#プロパティリンク "minodi@yandex.ru"


extern int period_EMA = 233,

period_SMA = 233,

ストップロス=30

マジック=55。

extern double Lot = 0.01;

extern string SesEnd ="22:00"; //Hai or Lowの境界時間


int HiTime,LoTime;

int time; // 次のバーで値をロールアップする。


//+------------------------------------------------------------------+

//| スクリプトプログラム起動機能

//+------------------------------------------------------------------+

int start()

{

//------- 日足、Fibs、High-Lowのレンダリング時間----------------+。

int shift = iBarShift(NULL,1440,Time[0]) + 1;

double HiPrice = iHigh(NULL,1440,shift); // ハイプライス

double LoPrice = iLow(NULL,1440,shift); // 安価な価格

double OpPrice = iOpen (NULL,1440,shift); //オープン価格

double ClPrice = iClose (NULL,1440,shift); // 終値。

datetime StTime = iTime(NULL,1440,shift); // ?

if(TimeDayOfWeek(StTime)==0/*Sunday*/)

{金曜日の高値・安値の追加

HiPrice = MathMax(HiPrice,iHigh(NULL,1440,shift+1));

LoPrice = MathMin(LoPrice,iLow(NULL,1440,shift+1));

OpPrice = iOpen(NULL,1440,shift+1);

ClPrice = iClose (NULL,1440,shift+1)です。

}

double Pivot =(HiPrice+LoPrice+ClPrice)/3;

Double Range =HiPrice-LoPrice;

double Fibo138 =1.382*Range;

double Fibo162 =1.618*Range;

double Fibo_138 =(LoPrice-1.382*Range)-Range;

double Fibo_162 =(LoPrice-1.618*Range)-Range;

//---------------- time hai and low-----------------------------------------+.


if (time!=Time[0]){HiTime=0;LoTime=0;time=Time[0];}.

if (High[0]>HiPrice)HiTime=TimeCurrent()。

if (Low[0]<LoPrice)LoTime=TimeCurrent();


Comment("このバーでは、"+"ⅳ時間高値="+HiTime+"ⅳ時間低値="+LoTime");

//-----------------Ценовой диапазон Демарка-------------------------------+

int currDay, i=0; //

if (currDay!=TimeDay(Time[i]))

{

if (ClPrice<OpPrice) double x=(HiPrice + LoPrice + LoPrice)/2;

if (ClPrice>OpPrice) x=(HiPrice + LoPrice + ClPrice + HiPrice)/2;

if (ClPrice==OpPrice) x=(HiPrice + LoPrice + ClPrice + ClPrice)/2;

i++;

}

double MaxDay = x - LoPrice; // デマークの価格帯

double MinDay = x - HiPrice; // デマークの価格範囲

// -----------Скользящие средние---------------------------------------------+

double EMA = iMA(15,0,period_EMA,0,MODE_EMA, PRICE_CLOSE,0)。

double SMA = iMA(15,0,period_SMA,0,MODE_SMA,PRICE_CLOSE,0);

double EMA1 = iMA(60,0,period_EMA,0,MODE_EMA,PRICE_CLOSE,0);

double SMA1 = iMA(60,0,period_SMA,0,MODE_SMA,PRICE_CLOSE,0);

//------------------Ордера----------------------------------------------------+

if (HiTime>LoTime){。

int ticket1 =OrderSend(Symbol(),OP_SELLLIMIT,Lot,HiPrice,0,0,Pivot,NULL,Magic,58000,Red);

int ticket2 =OrderSend(Symbol(),OP_SELLLIMIT,Lot,HiPrice,0,0,LoPrice,NULL,マジック、58000、赤)。

int ticket3 =OrderSend(Symbol(),OP_SELLLIMIT,Lot,Fibo138,0,0,HiPrice,NULL,Magic,58000,Red);

int ticket4 =OrderSend(Symbol(),OP_SELLLIMIT,Lot,Fibo138,0,0,LoPrice,NULL,Magic,58000,Red);

int ticket5 =OrderSend(Symbol(),OP_SELLLIMIT,ロット、Fibo162、0、0、HiPrice、NULL、マジック、58000、赤)。

int ticket6 =OrderSend(Symbol(),OP_SELLLIMIT,Lot,Fibo162,0,0,Pivot,NULL,Magic,58000,Red);

}

if (HiTime<LoTime){。

int ticket7=OrderSend(Symbol(),OP_BUYLIMIT,Lot,LoPrice,0,0,Pivot,NULL,Magic,58000,赤)。

int ticket8=OrderSend(Symbol(),OP_BUYLIMIT,Lot,LoPrice,0,0,HiPrice,NULL,マジック,58000,赤)。

int ticket9=OrderSend(Symbol(),OP_BUYLIMIT,Lot,Fibo_138,0,0,LoPrice,NULL,マジック,58000,赤)となります。

int ticket10=OrderSend(Symbol(),OP_BUYLIMIT,Lot,Fibo_138,0,0,Pivot,NULL,Magic,58000,Red);

int ticket11=OrderSend(Symbol(),OP_BUYLIMIT,Lot,Fibo_162,0,0,LoPrice,NULL,マジック,58000,赤)。

int ticket12=OrderSend(Symbol(),OP_BUYLIMIT,Lot,Fibo_162,0,0,Pivot,NULL,Magic,58000,Red);

}

if (HiTime>LoTime && ClPrice>Pivot) {。

int ticket13=OrderSend(Symbol(),OP_BUYLIMIT,Lot,Pivot,0,0,HiPrice,NULL,Magic,58000,Red);

int ticket14=OrderSend(Symbol(),OP_BUYLIMIT,ロット、ピボット、0、0、Fibo138、NULL、マジック、58000、赤);

}

if (HiTime<LoTime && ClPrice<Pivot)

int ticket15=OrderSend(Symbol(),OP_SELLLIMIT,Lot,Pivot,0,0,LoPrice,NULL,Magic,58000,Red);

int ticket16=OrderSend(Symbol(),OP_SELLLIMIT,Lot,Pivot,0,0,Fibo_138,NULL,Magic,58000,Red);

}

return(0)です。


//+------------------------------------------------------------------+


 

一見するとパラメータ

int currDay;


先ずは

 
ストップ高を忘れて、30pに置いてしまった
 
エラーを指摘し、コードを動作させたい
 

フォーラムの皆さん、理解に役立ててください...。

以下はコードの一部です(主なコードはExpert Advisorの構築マニュアルから引用しています)。

// 注文関数
//グローバル変数
// Mas_Ord_New[31][9] // 最後に判明した注文の配列
// Mas_Ord_Old[31][9] // 前(古)の注文の配列
// 第1インデックス = 注文番号
// [][0] は定義なし
// [][1] 開注文価格(abs.of an order (abc rate)
// [][2] StopLoss of an order (abc rate)
// [][3] TakeProfit of an order (abc rate)
// [][4] Order number
// [][5] number of lot of an order.(Abcレート)
// [][6] 注文種別0=B,1=S,2=BL,3=SL,4=BS,5=SS
// [][7] 発注のマジックナンバー
// [][8] 0/1

if (Mas_Ord_Old[old][6]==0 && Bid>Mas_Ord_Old[old][2] && Bid<Mas_Ord_Old[old][3])とする。
Inform(1, Mas_Ord_Old[old][4]); // つまり買い注文はカウンターシグナルで決済された
else if (Mas_Ord_Old[old][6]==0 && Bid<=Mas_Ord_Old[old][2])
Inform(19,Mas_Ord_Old[old][4],Mas_Ord_Old[old][2])// SLがトリガーしたことを意味する
else if (Mas_Ord_Old[old][6]==0 && Bid>=Mas_Ord_Old[old][3])
Inform(20,Mas_Ord_Old[old][4],Mas_Ord_Old[old][3]。// TAトリガー

else if (Mas_Ord_Old[old][6]==1 && Ask<Mas_Ord_Old[old][2] && Ask>Mas_Ord_Old[old][3])
Inform(2, Mas_Ord_Old[old][4]); // つまり売り注文はカウンターシグナルで決済される
else if (Mas_Ord_Old[old][6]==1 && Ask>=Mas_Ord_Old[old][2])
Inform(19,Mas_Ord_Old[old][4],Mas_Ord_Old[old][2]);。// SLがトリガーしたことを意味する
else if (Mas_Ord_Old[old][6]==1 && Ask<=Mas_Ord_Old[old][3])
Inform(20,Mas_Ord_Old[old][4],Mas_Ord_Old[old][3]); // TAトリガーした

あとは興味なし...。

問題:90%のケースで正しいパラメータが表示されます。例えば、SLがトリガーされた場合、パラメータは「19」、TPが「20」、注文が手動またはカウンター信号で閉じられた場合、パラメータは「1」または「2」です。そのように設計されているのです。

しかし、時には(かなり頻繁に)「20」の代わりに「19」(またはその逆)、あるいは「1」(「2」)が返されることがあります。注文の終了理由の条件として、"if "関数を正しく説明するのを助けてください。

理由は価格の四捨五入にあるのではないでしょうか?