コーディングの方法は? - ページ 299

 

MQL4でのカスタム時間入力

MQL4で、ユーザーによって定義されたバーからチャートの終わりまで水平線を 引くことができるコードを書くことは可能でしょうか?

以下はMetastockと同じコードです。

{Customer Inputs}

Dy:=Input("Day",1,31,1);

Mn:=Input("Month",1,12,1);

Yr:=Input("Year",2000,2012,2010);

{Time Calculation}

Time:=Dy=DayOfMonth() AND Mn=Month() AND Yr=Year();

{Formula}

Start:= ValueWhen(1,Time,CLOSE);

{Output}

Start;

そしてこれがその結果です。

MQL4で同じようなことができればと思います。

 

このように試してみてください。

#property indicator_chart_window

extern string startFrom = "2012.07.06 00:00";

int init() { return(0); }

int deinit() { ObjectDelete("hLine"); return(0); }

int start()

{

string name = "hLine";

int barShift = iBarShift(NULL,0,StrToTime(startFrom));

ObjectCreate(name,OBJ_TREND,0,0,0,0,0);

ObjectSet(name,OBJPROP_PRICE1,Close);

ObjectSet(name,OBJPROP_PRICE2,Close);

ObjectSet(name,OBJPROP_TIME1,Time);

ObjectSet(name,OBJPROP_TIME2,Time[0]);

return (0);

}

このコードをコピーして、あるインジケータ(すでに動作しているインジケータです)に貼り付けて、チャートに貼り付けてください。

kappari:
MQL4で、ユーザーによって定義されたバーからチャートの終わりまで水平線を引くことができるコードを書くことは可能でしょうか?

以下は、Metastockで同じコードです。

{Customer Inputs}

Dy:=Input("Day",1,31,1);

Mn:=Input("Month",1,12,1);

Yr:=Input("Year",2000,2012,2010);

{Time Calculation}

Time:=Dy=DayOfMonth() AND Mn=Month() AND Yr=Year();

{Formula}

Start:= ValueWhen(1,Time,CLOSE);

{Output}

Start;

結果はこんな感じです。

MQL4で同じようなことができればと思います。
 
mladen:
こんな感じでやってみてください。
#property indicator_chart_window

extern string startFrom = "2012.07.06 00:00";

int init() { return(0); }

int deinit() { ObjectDelete("hLine"); return(0); }

int start()

{

string name = "hLine";

int barShift = iBarShift(NULL,0,StrToTime(startFrom));

ObjectCreate(name,OBJ_TREND,0,0,0,0,0);

ObjectSet(name,OBJPROP_PRICE1,Close);

ObjectSet(name,OBJPROP_PRICE2,Close);

ObjectSet(name,OBJPROP_TIME1,Time);

ObjectSet(name,OBJPROP_TIME2,Time[0]);

return (0);

}
このインジケーターをコピー&ペーストして、チャートに貼り付けてください。

あなたは最高です、ありがとうございます。

 

ムラデンさん、こんにちは。

この関数の 根拠について、もう少し詳しく教えてください。まだよく理解できていないんです。ありがとうございます。

テランス

mladen:
この関数を試してみてください。
int countOpenedOrders(int type)

{

int openedOrders = 0;

for(int i=0; i < OrdersTotal(); i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;

if(OrderSymbol() != Symbol()) continue;

if(OrderMagicNumber() != MagicNumber) continue;

if(OrderType() == type) openedOrders++;

}

return(openedOrders);

}

[/PHP]

To count opened buy orders, call it like this :

int openedBuys = countOpened(OP_BUY);

to count opened sell orders, call it like this :

[PHP]int openedSells = countOpened(OP_SELL);
if openedBuys==0 open buy

if openedSells==0 open sell

.
 

tkuan77

注文を一度に1つの買いと1つの売りに制限したかったのですね。

そこで、いずれかのポジションをオープンする前にオープンオーダーカウンターを呼び出すと、オープンした買いまたは売りの数を制御 することができます。

例:

int openedBuys = countOpened(OP_BUY); if (openedBuys==0) code for open a buy order

例:openBuysが0以外の場合、新しい買い注文は開きません。同じロジックが売りにも適用されます(この投稿の2番目の例です)。

tkuan77:
こんにちは、Mladen。

この関数の論理的根拠について、もう少し詳しく教えてください。私はまだよく理解していません。ありがとうございます。

Terrance
 

ムラデンさん、こんにちは。

多分、私は自分自身を間違って伝えるかもしれません。私が達成しようとしていることは、私の買い基準が満たされたとき、それは買いをトリガーし、別の買い基準が再び満たされた場合、それは別の買いまたは売り基準が満たされた場合、売りをトリガーします。しかし、どの時点でも最大取引数は2です。

以前、あなたの方法を試しましたが、システムが同時に2つの取引を開始することがあり、バー機能で それを制限しようとしましたが、EAが同時に2つの取引を開始するという同じ問題が発生しました。

原因は何でしょうか?私のロジックに何か関係があるのでしょうか?

回答

Terrance

mladen:
tkuan77

注文を一度に1つの買いと1つの売りに制限したかったのですね。

そこで、ポジションをオープンする前にオープンオーダーカウンターを呼び出すと、オープンした買いまたは売りの数を制御することができます。

例:

int openedBuys = countOpened(OP_BUY); if (openedBuys==0) code for open a buy order
openBuysが0以外なら、新しい買い注文は出ません。同じロジックが売りにも適用される(この記事の2番目の例です)
 

現在のバーで何らかの注文がすでにオープンされているかどうかをチェックする機能を追加すれば、次のティックで新しい注文がオープンされるのを防ぐことができます。もし、イエス(現在のバーですでに注文が出されている)なら、新しい注文は出せない。もしそうでなければ、新しい注文を出すことができます。現在のバーで約定した注文をカウントする関数を 以下に示します。

int countOpenedOnACurrentBar(int type)

{

int openedAtBar = 0;

datetime startTime = Time[0];

datetime endTime = Time[0]+Period()*60;

for(int i=0; i < OrdersTotal(); i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;

if(OrderMagicNumber() != MagicNumber) continue;

if(OrderSymbol() != Symbol()) continue;

if(OrderType() != type) continue;

if(OrderOpenTime()=endTime) continue;

openedAtBar++;

break;

}

return(openedAtBar);

}

tkuan77:
こんにちは、Mladenです。

もしかしたら、私の説明が間違っていたかもしれません。私が達成しようとしていることは、私の買い基準が満たされたとき、それは買いをトリガーし、別の買い基準が再び満たされた場合、それは別の買いまたは売り基準が満たされた場合、売りをトリガーします。しかし、どの時点でも最大取引数は2です。

以前、あなたの方法を試しましたが、システムが同時に2つの取引を開始することがあり、バー機能でそれを制限しようとしましたが、EAが同時に2つの取引を開始するという同じ問題が発生しました。

原因は何でしょうか?私のロジックに何か関係があるのでしょうか?

回答

テランス
 
tkuan77:
こんにちは、Mladen。

多分、私は自分自身を誤って表現しているかもしれません。私が達成しようとしていることは、私の買い基準が満たされたとき、それは買いをトリガーし、別の買い基準が再び満たされた場合、それは別の買いまたは売り基準が満たされている場合、売りをトリガーします。しかし、どの時点でも最大取引数は2です。

以前、あなたの方法を試しましたが、システムが同時に2つの取引を開始することがあり、バー機能でそれを制限しようとしましたが、EAが同時に2つの取引を開始するという同じ問題が発生しました。

原因は何でしょうか?私のロジックに何か関係があるのでしょうか?

回答

テランス

それは、2つ目の取引が1つ目の取引とどのように異なるかを指定しなかったからです。違いはバーの本数やFirstBuyPriceからの価格などです。

 

Mladenさん、ありがとうございます!ただ、確認したいのですが、このコードはlong/short関数の前、間、または他の場所に置くのでしょうか?というのも、エラーが出続けるようで、その原因がわからないのです。また、MagicNumberは整数であるべきなのでしょうか?

テランス

total = OrdersTotal();

if(total < 2)

{

int countOpenedOnACurrentBar(int type)

{

int openedAtBar = 0;

datetime startTime = Time[0];

datetime endTime = Time[0]+Period()*60;

for(int i=0; i < OrdersTotal(); i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;

if(OrderMagicNumber() != MagicNumber) continue;

if(OrderSymbol() != Symbol()) continue; if(OrderSymbol() != Symbol()) continue;

if(OrderType() != type) continue; もし、OrderType() != type) continue;

if(OrderOpenTime()=endTime)continue。

openedAtBar++;

break;

return(openedAtBar)。

}

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,Ask-StopLoss*Point,Ask+TakeProfit*Point,

"私のEA",12345,0,緑);

if(チケット>0)

{

if(オーダーセレクト(チケット,SELECT_BY_TICKET,MODE_TRADES))

Print("BUY order opened : ",OrderOpenPrice());

else Print("BUY注文の開始エラー :",GetLastError())。

return(0);

}

if(isCrossed == 2 && shortEma < mainshortEma && longEma < mainshortEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,

"私のEA",12345,0,赤);

if(チケット>0)

{

if(オーダーセレクト(チケット,SELECT_BY_TICKET,MODE_TRADES))

Print("SELL order opened : ",OrderOpenPrice());

else Print("SELL注文の開始エラー :",GetLastError());

return(0);

return(0);

}

mladen:
現在のバーで何らかの注文がすでに開かれているかどうかをチェックするようにすれば、次のティックで新しい注文が開かれるのを防ぐことができます。もしイエスなら(現在のバーですでに注文が出されている)、新しい注文は出せない。もしそうでなければ、新しい注文を出すことができます。以下は、現在のバーで開かれたrewiredタイプの注文をカウントするための関数です。
int countOpenedOnACurrentBar(int type)

{

int openedAtBar = 0;

datetime startTime = Time[0];

datetime endTime = Time[0]+Period()*60;

for(int i=0; i < OrdersTotal(); i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;

if(OrderMagicNumber() != MagicNumber) continue;

if(OrderSymbol() != Symbol()) continue;

if(OrderType() != type) continue;

if(OrderOpenTime()=endTime) continue;

openedAtBar++;

break;

}

return(openedAtBar);

}

 

...

テランス

これは関数 です。これを EA の末尾に配置し、現在のバーで注文がすでに開かれているかどうかをチェックするために、適切と思われる場所に呼び出しを配置します。

tkuan77:
Mladenさん、ありがとうございます。というのも、エラーが出続けるようで、その原因がわからないのです。また、MagicNumberは整数値なのでしょうか?

Terrance

total = OrdersTotal();

if(total < 2)

{

int countOpenedOnACurrentBar(int type)

{

int openedAtBar = 0;

datetime startTime = Time[0];

datetime endTime = Time[0]+Period()*60;

for(int i=0; i < OrdersTotal(); i++)

{

if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES) == false) break;

if(OrderMagicNumber() != MagicNumber) continue;

if(OrderSymbol() != Symbol()) continue; if(OrderSymbol() != Symbol()) continue;

if(OrderType() != type) continue; もし、OrderType() != type) continue;

if(OrderOpenTime()=endTime)continue。

openedAtBar++;

break;

return(openedAtBar)。

}

if(isCrossed == 1 && shortEma > mainshortEma && longEma > mainshortEma)

{

ticket=OrderSend(Symbol(),OP_BUY,Lots,Ask,1,Ask-StopLoss*Point,Ask+TakeProfit*Point,

"私のEA",12345,0,緑);

if(チケット>0)

{

if(オーダーセレクト(チケット,SELECT_BY_TICKET,MODE_TRADES))

Print("BUY order opened : ",OrderOpenPrice());

else Print("BUY注文の開始エラー :",GetLastError())。

return(0);

}

if(isCrossed == 2 && shortEma < mainshortEma && longEma < mainshortEma)

{

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,1,Bid+StopLoss*Point,Bid-TakeProfit*Point,

"私のEA",12345,0,赤);

if(チケット>0)

{

if(オーダーセレクト(チケット,SELECT_BY_TICKET,MODE_TRADES))

Print("SELL order opened : ",OrderOpenPrice());

else Print("SELL注文の開始エラー :",GetLastError());

return(0);

return(0)。

}