私の記憶が正しければ、昔、ある " Order Modifier " EA がこのように動作するのを見たことがあります。それは、ドラッグ中は更新されず、 " Drag OFF " でラインをドラッグすると、ドラッグ後に "Stop Loss andTake Profit" の値が一度だけ変更できたものでした。 そこで、今回のコメントを3回以上読み、また、ドラッグ中の更新を停止できるように少しづつ変更してみました。
// this is just example for that what I am thinking datetime time = 0; // I just want to ignore this because I just want to give to X = 20; fixed mode ( should not change ever ) double price = ObjectGetDouble( 0, "line", OBJPROP_PRICE, 0 );
int x,y;
ChartTimePriceToXY( long chart_id, int sub_window, datetime time, double price, int& x, int& y );
//+------------------------------------------------------------------+ //| CrossHair.mq4 | //| Copyright 2017, Marco vd Heijden, MetaQuotes Software Corp. | //| https://www.mql5.com | //+------------------------------------------------------------------+ #property copyright"Copyright 2017, Marco vd Heijden, MetaQuotes Software Corp." #property link"https://www.mql5.com" #property version"1.00" #property strict //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ intOnInit() { //--- create some lines ObjectCreate(0,"X",OBJ_HLINE,0,0,Ask); // X = Horizontal Axis (time==0) ObjectCreate(0,"Y",OBJ_VLINE,0,TimeCurrent(),0);// Y = Vertical Axis (price==0) //--- return(INIT_SUCCEEDED); } //+------------------------------------------------------------------+ //| Expert deinitialization function | //+------------------------------------------------------------------+ voidOnDeinit(constint reason) { //--- clean up ObjectsDeleteAll(0,0,EMPTY); } //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ voidOnTick() { //---
} //+------------------------------------------------------------------+ //| ChartEvent function | //+------------------------------------------------------------------+ voidOnChartEvent(constint id, constlong &lparam, constdouble &dparam, conststring &sparam) { //--- If this is an event of a mouse click on the chart if(id==CHARTEVENT_CLICK) { //--- Prepare variables int x =(int)lparam; int y =(int)dparam; datetime time =0; double price =0; int window=0; //--- Convert the X and Y coordinates in terms of date/time if(ChartXYToTimePrice(0,x,y,window,time,price)) { ObjectMove(0,"X",0,0,price); // notice time==0 because horizontal axis ObjectMove(0,"Y",0,time,0); // notice price==0 because vertical axis } else Print("ChartXYToTimePrice return error code: ",GetLastError()); Print("+--------------------------------------------------------------+"); } } //+------------------------------------------------------------------+
私はすでにそのドキュメントを読みましたが、あなたの最新のコメントまで、私はそれを明確に理解することはできませんでした。実は、まだ試していないのですが、以下のコードで苦労しているので、良い結果を得るためにいくつかの方法を既に試しましたが、できませんでした。 Marco さん、最新の素晴らしいコメントをありがとうございます。
// actually here is a graphical objects functin() // here one of them // also which one soon I will try to below objects could moves together " tphline " - but I can't take a time to research about your latest comment and so... ObjectCreate( "recl object", OBJ_RECTANGLE, 0, 0, tpprice ); // I feel I could add something to " string name " - I already tried few things not good results
ドラッグが検出されたらカウンターをスタートさせるとか、いろいろ方法は あるんだけど...。
( 私は今の ところ、あなたの最新のコメントにあるような方法でやっています。)
マルコ さん、ありがとうございました。
今はまだですが、この「SLと TP」の機能に、どれを追加するか、後でやってみようと思っています。ただ、そのためのスクリプトを書き始める前に、それについていろいろと研究する必要があるんだ。
よろしくお願いします。
私の記憶が正しければ、昔、ある " Order Modifier " EA がこのように動作するのを見たことがあります。それは、ドラッグ中は更新されず、 " Drag OFF " でラインをドラッグすると、ドラッグ後に "Stop Loss andTake Profit" の値が一度だけ変更できたものでした。
そこで、今回のコメントを3回以上読み、また、ドラッグ中の更新を停止できるように少しづつ変更してみました。
Q: では、無理なのでしょうか、お願いします。
ありがとうございます。
ブーリアン・フラグ drag == 1 である限り、この同じフラグを使用して更新を無効にすることができます。
カウンターをスタートさせることもできるんだ。その例がこれ。
//| Drag Hline2.mq4 |
//| Copyright 2017, Marco vd Heijden, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Marco vd Heijden, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
double price;
bool drag;
int cnt=0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- create timer
EventSetTimer(1);
ObjectCreate(0,"line",OBJ_HLINE,0,0,Ask);
price=ObjectGetDouble(0,"line",OBJPROP_PRICE,0);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- destroy timer
EventKillTimer();
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
}
//+------------------------------------------------------------------+
//| Timer function |
//+------------------------------------------------------------------+
void OnTimer()
{
//---
if(price!=ObjectGetDouble(0,"line",OBJPROP_PRICE,0))
{
drag=1;
}
if(drag==1)
{
cnt++; // increase counter
{
if(cnt>=2)// if counter == 2 seconds
{
price=ObjectGetDouble(0,"line",OBJPROP_PRICE,0); // store new value
Print(" New price: ",DoubleToString(price));
PlaySound("ok.wav");
cnt=0; // reset counter
drag=0; // reset drag
}
}
}
}
//+------------------------------------------------------------------+
あるいは、単純にwhileループを使ってもいいし、これはとてもうまくいくよ。
//| Timer function |
//+------------------------------------------------------------------+
void OnTimer()
{
//---
while(price!=ObjectGetDouble(0,"line",OBJPROP_PRICE,0))
{
PlaySound("ok.wav");
price=ObjectGetDouble(0,"line",OBJPROP_PRICE,0);
Comment(price);
}
}
//+------------------------------------------------------------------+
さて、ブーリアン・フラグ drag == 1 である限り、この同じフラグを使用してアップデートを無効にすることができます。
また、カウンターをスタートさせることもできます。
また、単純にwhileループを使うこともできます。
ドラッグしている間、価格が等しくなるまで(ドラッグを止めたとき)更新する、というものだ。
( そしてあなたのコードも )
どのような華麗な 例男?それは本当に非常に非常に有用なコメント です、どうもありがとうございます。そして今、私はそのライン(デザインと機能)に対して、さらに多くのものを追加しようとしています。
( どうか、この質問で私を責めないでください。私はグラフィカルなオブジェクトのためにそれを使用している " graphics() " を持っていて、私は Init() を通してそれを呼び出していて、私は OnTimer() を通してそれを呼び出す必要があります。)
よろしくお願いします。
4200エラーは、オブジェクトが すでに存在するため、オブジェクトの作成に 失敗しましたというものです。
したがって、オブジェクトを作成または変更する前に、そのオブジェクトが存在するかどうかを確認する必要があります。
これを利用することができます。
{
//Object does not exist
}
and/or
if(ObjectFind(0,"Long")>=0)
{
// Object already exists
}
使うことができます。
うーん、これは私にとって本当に新しい機能 です。
それについて研究した後、私は試すことができます。( 私はそれを何度も見ましたが、私はそれを使ったことがありません。)
ありがとうございました。
#価格をピクセルに変換する - Open
私は、テイクプロフィット 機能に"HLine "を使用しています。
いくつかのオブジェクト(Label, RecLabel...など)を持っているのですが、そのオブジェクトを" HLine "オブジェクトで動かしたいのです。そこで、以下のような関数を見つけました。しかし、私は、" X " を変換したいわけではありません。価格だけをYに変換したいのです。
以下のコードでは、何も試していません。
Q: 私はそれが私のこの懸念のために私を助けることができることを確認したいので?
(もし、それが役に立つとわかれば、私の懸念のためにそれを試し始めるでしょう)。
Q: また、いくつかのオブジェクトは、" HLine "で移動することができるメソッドがあるのでしょうか?
datetime time = 0; // I just want to ignore this because I just want to give to X = 20; fixed mode ( should not change ever )
double price = ObjectGetDouble( 0, "line", OBJPROP_PRICE, 0 );
int x,y;
ChartTimePriceToXY( long chart_id, int sub_window, datetime time, double price, int& x, int& y );
よろしくお願いします。
あなたは、多くの方法で多くのことを行うことができ、もう少し具体的にする必要があります。
これらの関数はOnChartEvent()関数で使用されます。
ChartPriceToXY - 価格の座標への時間変換を提供しますが、これは本当に必要なものですか?
多分、ChartXYToTimePrice()のことですね?
https://www.mql5.com/en/docs/chart_operations/chartxytotimeprice
もし、この値が必要でなければ、ゼロを渡すことができます。
//| CrossHair.mq4 |
//| Copyright 2017, Marco vd Heijden, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Marco vd Heijden, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- create some lines
ObjectCreate(0,"X",OBJ_HLINE,0,0,Ask); // X = Horizontal Axis (time==0)
ObjectCreate(0,"Y",OBJ_VLINE,0,TimeCurrent(),0);// Y = Vertical Axis (price==0)
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- clean up
ObjectsDeleteAll(0,0,EMPTY);
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
}
//+------------------------------------------------------------------+
//| ChartEvent function |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
const long &lparam,
const double &dparam,
const string &sparam)
{
//--- If this is an event of a mouse click on the chart
if(id==CHARTEVENT_CLICK)
{
//--- Prepare variables
int x =(int)lparam;
int y =(int)dparam;
datetime time =0;
double price =0;
int window=0;
//--- Convert the X and Y coordinates in terms of date/time
if(ChartXYToTimePrice(0,x,y,window,time,price))
{
ObjectMove(0,"X",0,0,price); // notice time==0 because horizontal axis
ObjectMove(0,"Y",0,time,0); // notice price==0 because vertical axis
}
else
Print("ChartXYToTimePrice return error code: ",GetLastError());
Print("+--------------------------------------------------------------+");
}
}
//+------------------------------------------------------------------+
私はすでにそのドキュメントを読みましたが、あなたの最新のコメントまで、私はそれを明確に理解することはできませんでした。実は、まだ試していないのですが、以下のコードで苦労しているので、良い結果を得るためにいくつかの方法を既に試しましたが、できませんでした。
Marco さん、最新の素晴らしいコメントをありがとうございます。
私は本当に私の懸念に対する解決策を見つけるために多くの時間を費やしたが、私は良い結果を得ることができません。
しかし、とにかく私は(現在ポジションを開いている)テイクプロフィット 価格を取得することができます、私は" hline "オブジェクトが自分自身にテイクプロフィット価格を呼び出すことができ、それが動作しています。そして、それはちょうど初回に動作しています。Init()の中にあるので、それは分かっています。しかし、私はそれを " OnTimer() " に入れようとしましたが、idは正しく動作しません。
この問題に対して、私が何を学び、何をすべきかを理解するのに役立つ何かを教えてください。
7時間後に、この問題についての研究を再開する予定です。
もし、良いコメントがあれば、それは私にとってより良いものになるでしょう。
for ( i = OrdersTotal() - 1; i >= 0; i-- )
{
if ( ! OrderSelect( i, SELECT_BY_POS, MODE_TRADES ) ) continue;
if ( OrderSymbol() == Symbol() ) tpprice = OrderTakeProfit();
ObjectCreate (
"#" + IntegerToString( OrderTicket() ) + " -" + "tphline", // name
OBJ_HLINE,
0, // subwindow
0, // time
tpprice // price1
);
tpprice =
ObjectGetDouble (
0,
"#" + IntegerToString( OrderTicket() ) + " -" + "tphline", // name
OBJPROP_PRICE, 0
);
}
// ontimer() --------------------------------------------------------
if ( tpprice != ObjectGetDouble( 0, "#" + IntegerToString( OrderTicket() ) + " -" + "tphline", OBJPROP_PRICE, 0 ) )
{
tpdrag = 1;
}
if ( tpdrag == 1 )
{
tpprice = ObjectGetDouble( 0, "#" + IntegerToString( OrderTicket() ) + " -" + "tphline", OBJPROP_PRICE, 0 );
Print( "tpdrag: ", tpdrag, " - Price: ", DoubleToString( tpprice, Digits ) );
// actually here is a graphical objects functin()
// here one of them
// also which one soon I will try to below objects could moves together " tphline " - but I can't take a time to research about your latest comment and so...
ObjectCreate( "recl object", OBJ_RECTANGLE, 0, 0, tpprice ); // I feel I could add something to " string name " - I already tried few things not good results
tpdrag = 0;
}
//---
return;
ありがとうございました。
よろしくお願いします。
ツールタブの下にあるスタイラスを使用してください。
あなたが何をしようとしているのかわからないので、何をしたいのか推測しなければなりませんが、これは決して良いことではありません。
しかし、ここにある例を見ることができます。
//| Stealth 4.mq4 |
//| Copyright 2017, Marco vd Heijden, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2017, Marco vd Heijden, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict
static input int takeprofit=500;// Take Profit
static input int stoploss=500; // Stop Loss
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- create timer
EventSetTimer(1);
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- destroy timer
EventKillTimer();
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
}
//+------------------------------------------------------------------+
//| Timer function |
//+------------------------------------------------------------------+
void OnTimer()
{
for(int order=OrdersTotal(); order>=0; order--)
{
bool selected=OrderSelect(order,SELECT_BY_POS);
{
if(selected==1)
{
if(Symbol()==OrderSymbol()) // only for current chart symbol
{
switch(OrderType())
{
case OP_BUY: // for buy order
{
// if objects not found - create them
if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-TP")<0)
{
ObjectCreate(0,"#"+IntegerToString(OrderTicket())+"-TP",OBJ_HLINE,0,0,OrderOpenPrice()+takeprofit*Point());
ObjectSet("#"+IntegerToString(OrderTicket())+"-TP",7,3);
}
if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-SL")<0)
{
ObjectCreate(0,"#"+IntegerToString(OrderTicket())+"-SL",OBJ_HLINE,0,0,OrderOpenPrice()-stoploss*Point());
ObjectSet("#"+IntegerToString(OrderTicket())+"-SL",7,3);
}
// if objects exist
if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-TP")>=0)
{
if(Bid>ObjectGetDouble(0,"#"+IntegerToString(OrderTicket())+"-TP",OBJPROP_PRICE,0))
{
bool close=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,clrBlue);
{
if(close==0)
{
Alert(" Order Close Error! # "+IntegerToString(OrderTicket()));
}
if(close==1)
{
Alert(" Order: "+IntegerToString(OrderTicket())+" Closed due to TP Profit = "+DoubleToString(OrderProfit(),2));
ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-TP");
ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-SL");
}
}
}
}
if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-SL")>=0)
{
if(Ask<ObjectGetDouble(0,"#"+IntegerToString(OrderTicket())+"-SL",OBJPROP_PRICE,0))
{
bool close=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,clrBlue);
{
if(close==0)
{
Alert(" Order Close Error! # "+IntegerToString(OrderTicket()));
}
if(close==1)
{
Alert(" Order: "+IntegerToString(OrderTicket())+" Closed due to SL Profit = "+DoubleToString(OrderProfit(),2));
ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-TP");
ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-SL");
}
}
}
}
}
break;
case OP_SELL: // for sell order
{
// if objects not found - create them
if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-TP")<0)
{
ObjectCreate(0,"#"+IntegerToString(OrderTicket())+"-TP",OBJ_HLINE,0,0,OrderOpenPrice()-takeprofit*Point());
ObjectSet("#"+IntegerToString(OrderTicket())+"-TP",7,3);
}
if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-SL")<0)
{
ObjectCreate(0,"#"+IntegerToString(OrderTicket())+"-SL",OBJ_HLINE,0,0,OrderOpenPrice()+stoploss*Point());
ObjectSet("#"+IntegerToString(OrderTicket())+"-SL",7,3);
}
// if objects exist
if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-TP")>=0)
{
if(Ask<ObjectGetDouble(0,"#"+IntegerToString(OrderTicket())+"-TP",OBJPROP_PRICE,0))
{
bool close=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,clrBlue);
{
if(close==0)
{
Alert(" Order Close Error! # "+IntegerToString(OrderTicket()));
}
if(close==1)
{
Alert(" Order: "+IntegerToString(OrderTicket())+" Closed due to TP Profit = "+DoubleToString(OrderProfit(),2));
ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-TP");
ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-SL");
}
}
}
}
if(ObjectFind(0,"#"+IntegerToString(OrderTicket())+"-SL")>=0)
{
if(Bid>ObjectGetDouble(0,"#"+IntegerToString(OrderTicket())+"-SL",OBJPROP_PRICE,0))
{
bool close=OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),3,clrBlue);
{
if(close==0)
{
Alert(" Order Close Error! # "+IntegerToString(OrderTicket()));
}
if(close==1)
{
Alert(" Order: "+IntegerToString(OrderTicket())+" Closed due to SL Profit = "+DoubleToString(OrderProfit(),2));
ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-TP");
ObjectDelete(0,"#"+IntegerToString(OrderTicket())+"-SL");
}
}
}
}
}
break;
}
}
}
}
}
}
//+------------------------------------------------------------------+
オブジェクト 自身が値を保持しているので、値を別の double 型にコピーする必要はありませんし、行をドラッグすると値は自動的に変化し、次に読むときに表示されます。