voidOnTick() { //--- MqlDateTime server_time; TimeToStruct(TimeCurrent(),server_time); //--- если значение минут серверного времени кратно заданному значению, в частности 20-ти минутам или равно 0 if(server_time.min%minutesBefore==0 || server_time.min==0) { if(SignalByRSI(Symbol(),TimeframeRSI,minutesBefore)==OP_BUY) { //--- получили сигнал на покупку Print("Сигнал на покупку ",TimeCurrent()); // Проверочное сообщение в журнал //--- проверка наличия уже открытой позиции на покупку if (OrdersTotal() == 0) { ticket=OrderSend(Symbol(),OP_BUY, Lts, Ask, 0, 0, 0, NULL, 1234, 0, Blue); Alert ("Есть сигнал на покупку ", sim, per); } if (OrdersTotal() >0)
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) if(OrderType()==OP_SELL) { OrderClose(ticket, OrderLots(), Bid,0,Blue); { ticket=OrderSend(Symbol(),OP_BUY, Lts, Ask, 0, 0, 0, NULL, 1234, 0, Blue); Alert ("Есть сигнал на закрытие продажи и открытие покупки ", sim, per); } }
//--- вызов функции открытия позиции на покупку } if(SignalByRSI(Symbol(),TimeframeRSI,minutesBefore)==OP_SELL) { //--- получили сигнал на продажу Print("Сигнал на продажу ",TimeCurrent()); // Проверочное сообщение в журнал //--- проверка наличия уже открытой позиции на продажу if (OrdersTotal() == 0) { ticket=OrderSend(Symbol(),OP_SELL, Lts, Bid, 0, 0, 0, NULL, 1234, 0, Red); Alert ("Есть сигнал на продажу ", sim, per); } if (OrdersTotal() >0)
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES)) if(OrderType()==OP_BUY) { OrderClose(ticket, OrderLots(), Ask,0,Red); { ticket=OrderSend(Symbol(),OP_SELL, Lts, Bid, 0, 0, 0, NULL, 1234, 0, Red); Alert ("Есть сигнал на закрытие покупки и открытие продажи ", sim, per); } } //--- вызов функции открытия позиции на продажу } } }
こんにちは、私はAndroid 2.3用のMetatrader 4ターミナルのアップグレードに関する スレッドを見つけられませんでしたので、このスレッドに投稿した私をあまり責めないでください。市販の端末では、Android 4以上のみ。私のは動かなくなったので、どこでアップデートができるのでしょうか。
トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム
ターミナル mt5 と mt4 が動作しない。
レナート・ファットフーリン, 2016.11.13 23:51
Android 4.0.3未満はサポート対象外です。そこで説明することがないので、誰も答えてくれないのです。あなたが示したチャートは意味がなく、どのように入手したのか謎です。
テスターの「最適化グラフ」タブにある「2次元表面」オプションは、EAの2つの入力パラメータを最適化する必要がある場合や、履歴上の2つのパラメータのどの値で良い結果が得られたか、これらのパラメータが相互に依存しているか、それらが全く意味をなしているかどうかを視覚的に見るために意味があります(imho)。
両軸になぜか0しかなく、縦方向にこの0が3つの中間ステップに分かれているため、「中央に1個、下・上に2個、1マスに2個・3個のキューブ」がある。 そして結果はランダムに見える、白と緑の「キューブ」がランダムに散らばっている。だから、このグラフは意味がなく、何の意味もなさないように思える。
グラフでは意味がわからないかもしれませんが、2014年から2015年の期間で最適化を行い、より良いパラメータを選択・設定して2014年から今日まで再テストを行ったところ、損失/ドローダウンの結果は変わらず、まあ、期間に比例して利益は増えています。また、ボットは1ヶ月間デモで動いていたのですが、最後の1ヶ月間デフォルトのパラメータでテスト中にすべてのディールがテスターと一致=+5ppとなりました。だから、立方体やその色で遊ぶのはやめようね。
分かりやすい説明ありがとうございます。
私はMQL4を勉強しようとしているため、私の質問には悪しからずご了承ください。
保留中の注文が 現在の価格ではなく、計算中に得られた価格で発注された場合、SLとTPを正しく計算する方法を教えてください。
ローソク足の長さに基づいて計算されるはずです。だいたいこんな感じです。
TP=NormalizeDouble(((iOpen(NULL,0,1))-(iLow(NULL,0,1)))*KoefTP*ポイント、桁);
ありがとうございました。
こんにちは。
MQL4を勉強しようと思っているので、質問には悪しからずご了承ください。
保留中の注文で、現在の価格ではなく、計算中に得られた価格で発注された場合、SLとTPを正しく計算する方法を教えてください。
ローソク足の長さに基づいて計算されるはずです。だいたいこんな感じです。
TP=NormalizeDouble(((iOpen(NULL,0,1))-(iLow(NULL,0,1)))*KoefTP*ポイント、桁);
ありがとうございました。
ここでは、あらゆる種類の注文に対して、正しいストップオーダーを計算する関数を紹介します。
double CorrectStopLoss(string symbol_name,int op,double price_set,double stop_loss) {
if(stop_loss==0) return(0);
double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,stop_loss),dg));
else return(NormalizeDouble(fmax(price+(lv+1)*pt,stop_loss),dg));
}
//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,int stop_loss) {
if(stop_loss==0) return(0);
double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,price-stop_loss*pt),dg));
else return(NormalizeDouble(fmax(price+(lv+1)*pt,price+stop_loss*pt),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,double take_profit) {
if(take_profit==0) return(0);
double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,take_profit),dg));
else return(NormalizeDouble(fmin(price-(lv+1)*pt,take_profit),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,int take_profit) {
if(take_profit==0) return(0);
double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,price+take_profit*pt),dg));
else return(NormalizeDouble(fmin(price-(lv+1)*pt,price-take_profit*pt),dg));
}
//+------------------------------------------------------------------+
int StopLevel(string symbol_name) {
int sp=(int)SymbolInfoInteger(symbol_name,SYMBOL_SPREAD);
int lv=(int)SymbolInfoInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL);
return((lv==0)?sp*2:lv);
}
//+------------------------------------------------------------------+
{
//---
MqlDateTime server_time;
TimeToStruct(TimeCurrent(),server_time);
//--- если значение минут серверного времени кратно заданному значению, в частности 20-ти минутам или равно 0
if(server_time.min%minutesBefore==0 || server_time.min==0) {
if(SignalByRSI(Symbol(),TimeframeRSI,minutesBefore)==OP_BUY) {
//--- получили сигнал на покупку
Print("Сигнал на покупку ",TimeCurrent()); // Проверочное сообщение в журнал
//--- проверка наличия уже открытой позиции на покупку
if (OrdersTotal() == 0)
{
ticket=OrderSend(Symbol(),OP_BUY, Lts, Ask, 0, 0, 0, NULL, 1234, 0, Blue);
Alert ("Есть сигнал на покупку ", sim, per);
}
if (OrdersTotal() >0)
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
if(OrderType()==OP_SELL)
{
OrderClose(ticket, OrderLots(), Bid,0,Blue);
{
ticket=OrderSend(Symbol(),OP_BUY, Lts, Ask, 0, 0, 0, NULL, 1234, 0, Blue);
Alert ("Есть сигнал на закрытие продажи и открытие покупки ", sim, per);
}
}
//--- вызов функции открытия позиции на покупку
}
if(SignalByRSI(Symbol(),TimeframeRSI,minutesBefore)==OP_SELL) {
//--- получили сигнал на продажу
Print("Сигнал на продажу ",TimeCurrent()); // Проверочное сообщение в журнал
//--- проверка наличия уже открытой позиции на продажу
if (OrdersTotal() == 0)
{
ticket=OrderSend(Symbol(),OP_SELL, Lts, Bid, 0, 0, 0, NULL, 1234, 0, Red);
Alert ("Есть сигнал на продажу ", sim, per);
}
if (OrdersTotal() >0)
if (OrderSelect(ticket, SELECT_BY_TICKET, MODE_TRADES))
if(OrderType()==OP_BUY)
{
OrderClose(ticket, OrderLots(), Ask,0,Red);
{
ticket=OrderSend(Symbol(),OP_SELL, Lts, Bid, 0, 0, 0, NULL, 1234, 0, Red);
Alert ("Есть сигнал на закрытие покупки и открытие продажи ", sim, per);
}
}
//--- вызов функции открытия позиции на продажу
}
}
}
ここでは、あらゆる種類の注文に対して、正しいストップオーダーを計算する関数を紹介します。
double CorrectStopLoss(string symbol_name,int op,double price_set,double stop_loss) {
if(stop_loss==0) return(0);
double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,stop_loss),dg));
else return(NormalizeDouble(fmax(price+(lv+1)*pt,stop_loss),dg));
}
//+------------------------------------------------------------------+
double CorrectStopLoss(string symbol_name,int op,double price_set,int stop_loss) {
if(stop_loss==0) return(0);
double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmin(price-(lv+1)*pt,price-stop_loss*pt),dg));
else return(NormalizeDouble(fmax(price+(lv+1)*pt,price+stop_loss*pt),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,double take_profit) {
if(take_profit==0) return(0);
double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,take_profit),dg));
else return(NormalizeDouble(fmin(price-(lv+1)*pt,take_profit),dg));
}
//+------------------------------------------------------------------+
double CorrectTakeProfit(string symbol_name,int op,double price_set,int take_profit) {
if(take_profit==0) return(0);
double pt=SymbolInfoDouble(symbol_name,SYMBOL_POINT);
double price=(op==OP_BUY)?SymbolInfoDouble(symbol_name,SYMBOL_BID):(op==OP_SELL)?SymbolInfoDouble(symbol_name,SYMBOL_ASK):price_set;
int lv=StopLevel(symbol_name), dg=(int)SymbolInfoInteger(symbol_name,SYMBOL_DIGITS);
if(op==OP_BUY || op==OP_BUYLIMIT || op==OP_BUYSTOP) return(NormalizeDouble(fmax(price+(lv+1)*pt,price+take_profit*pt),dg));
else return(NormalizeDouble(fmin(price-(lv+1)*pt,price-take_profit*pt),dg));
}
//+------------------------------------------------------------------+
int StopLevel(string symbol_name) {
int sp=(int)SymbolInfoInteger(symbol_name,SYMBOL_SPREAD);
int lv=(int)SymbolInfoInteger(symbol_name,SYMBOL_TRADE_STOPS_LEVEL);
return((lv==0)?sp*2:lv);
}
//+------------------------------------------------------------------+
アルテムさん、ありがとうございます!調べてみますね。
どういたしまして。成行注文や未決済注文の 始値を知り、正確な逆指値を取得する必要がある場合は、これらの関数を使用して必要な価格を取得します - これらは、必要な逆指値注文に対して既に計算された価格を返します。
double priseSet=1.12345;
次に、BuyLimit のストップロス価格
int StopLoss=20; ポイントは次のようになります。
double sl=CorrectStopLoss(Symbol(),OP_BUYLIMIT,priceSet,StopLoss);
この sl 変数は StopLevel 条件で正しく計算した BuyLimit のストップロスを取得することになります。
ここにヒントがあります。ショートポジションが開設されたとします。買いシグナルの場合、ショートをクローズし、ロングをオープンする。
売りポジションが あるかどうかを確認します。その場合は、閉じてください。
その後、買いポジションを建てる。
初歩的なことですが。
mql4を使って、このようなアルゴリズムを実装してみたいという思いが強いです。
異なるブローカーによる2つのMT4端末があります。そのうちの1つには「排他的」インジケータがあり、(「マーケット」のように)他の端末に移動することはできません。
それがどうした!?専用」インジケーターのバッファの読み取り値を、自分の端末のインジケーターに実装することは可能でしょうか?
リソースがどうにもこうにも動かない。