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[]) { //--- for(int i = 1; i < 100;i++)
intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
//---for(int i = 1; i < 100;i++)
{
if(open[i] > Max)
{
if(intObjectFind(chart_id, /* идентификатор графика*/ object_name/* имя объекта*/) < 0)
ObjectCreate(Здесь параметры функции согласно документации.
Например, эллипса, или буквы на графике, или еще чего-нибудь);
} //if(open)
} //for(int i) //--- return value of prev_calculated for next callreturn(rates_total);
} // OnCalculate
//+------------------------------------------------------------------+//| Set.mq5 |//| Copyright 2018 |//+------------------------------------------------------------------+#property copyright"Copyright 2018"#property version"1.00"#property indicator_chart_window#property indicator_plots0//+------------------------------------------------------------------+//| Custom indicator initialization function |//+------------------------------------------------------------------+intOnInit()
{
EllipseCreate(0, "Ellipse", 0, 0, 0, 0, 0, 0, 0, clrRed, STYLE_SOLID, 1, true, true);
//--- indicator buffers mappingreturn(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+//| Custom indicator iteration function |//+------------------------------------------------------------------+intOnCalculate(constint rates_total,
constint prev_calculated,
constdatetime &time[],
constdouble &open[],
constdouble &high[],
constdouble &low[],
constdouble &close[],
constlong &tick_volume[],
constlong &volume[],
constint &spread[])
{
//---ArraySetAsSeries(time,true);
ArraySetAsSeries(open,true);
// ....ObjectMove(0, "Ellipse",0,time[1],open[5]);
ObjectMove(0, "Ellipse",1,time[10],open[15]);
ObjectMove(0, "Ellipse",2,time[20],open[25]);
//--- return value of prev_calculated for next callreturn(rates_total);
}
//+------------------------------------------------------------------+bool EllipseCreate(constlong chart_ID=0, // ID графика conststring name="Ellipse", // имя эллипса constint sub_window=0, // номер подокна datetime time1=0, // время первой точки double price1=0, // цена первой точки datetime time2=0, // время второй точки double price2=0, // цена второй точки datetime time3=0, // время третьей точки double price3=0, // цена третьей точки constcolor clr=clrRed, // цвет эллипса constENUM_LINE_STYLE style=STYLE_SOLID, // стиль линий эллипса constint width=1, // толщина линий эллипса constbool fill=false, // заливка эллипса цветом constbool back=false, // на заднем плане constbool selection=true, // выделить для перемещений constbool hidden=true, // скрыт в списке объектов constlong z_order=0) // приоритет на нажатие мышью
{
//--- установим координаты точек привязки, если они не заданы // ChangeEllipseEmptyPoints(time1,price1,time2,price2,time3,price3); //--- сбросим значение ошибки ResetLastError();
//--- создадим эллипс по заданным координатам if(!ObjectCreate(chart_ID,name,OBJ_ELLIPSE,sub_window,time1,price1,time2,price2,time3,price3))
{
Print(__FUNCTION__,
": не удалось создать эллипс! Код ошибки = ",GetLastError());
return(false);
}
//--- установим цвет эллипса ObjectSetInteger(chart_ID,name,OBJPROP_COLOR,clr);
//--- установим стиль линий эллипса ObjectSetInteger(chart_ID,name,OBJPROP_STYLE,style);
//--- установим толщину линий эллипса ObjectSetInteger(chart_ID,name,OBJPROP_WIDTH,width);
//--- включим (true) или отключим (false) режим заливки эллипса ObjectSetInteger(chart_ID,name,OBJPROP_FILL,fill);
//--- отобразим на переднем (false) или заднем (true) плане ObjectSetInteger(chart_ID,name,OBJPROP_BACK,back);
//--- включим (true) или отключим (false) режим выделения эллипса для перемещений //--- при создании графического объекта функцией ObjectCreate, по умолчанию объект //--- нельзя выделить и перемещать. Внутри же этого метода параметр selection //--- по умолчанию равен true, что позволяет выделять и перемещать этот объект ObjectSetInteger(chart_ID,name,OBJPROP_SELECTABLE,selection);
ObjectSetInteger(chart_ID,name,OBJPROP_SELECTED,selection);
//--- скроем (true) или отобразим (false) имя графического объекта в списке объектов ObjectSetInteger(chart_ID,name,OBJPROP_HIDDEN,hidden);
//--- установим приоритет на получение события нажатия мыши на графике ObjectSetInteger(chart_ID,name,OBJPROP_ZORDER,z_order);
//--- успешное выполнение return(true);
}
Можно запустить Windows параллельно с macOS® (перезагрузка не требуется) на компьютерах MacBook®, MacBook Pro®, iMac®, iMac Pro®, Mac mini® или Mac Pro®. Предоставляйте общий доступ к файлам и папкам, копируйте и вставляйте текст и изображения, перетаскивайте файлы между приложениями Mac и Windows. Удобная настройка Parallels Desktop...
一番簡単な作業はすでに説明した通りです。
MetaEditorを起動します。
ファイル]-[作成]をクリックします。
ポップアップフィールドで「Indicator」を選択します。
...
しかし、このコードはMQLトランスレータに受け入れられません。
20分ほどで回答します
あなたたち子どもは、本当に何をやっているんですか、水をあおっているんですよ。
誰も騒がない。ようやく状況が少しクリアになりつつあります。メインコードのボディに置くことができない関数をスクリプトと呼ぶことが判明したのです。
また、MTは第三者の攻撃から守らなければならないお金で動くことを目的としていることを忘れてはいけません。それゆえ、この言語の限界のほとんどは、このようなものなのです。
簡単な作業はすでに説明した通りです。
MetaEditorを起動します。
ファイル]-[作成]をクリックします。
ポップアップフィールドで「Indicator」を選択します。
インジケータOnCalculate()では、OnStart()イベントを持つ任意のスクリプトオブジェクトを導入します。
個人的にはどうしたらいいのかわからない。そうですね、例えばこんな感じです。
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[])
{
//---
for(int i = 1; i < 100;i++)
{
if(open[i] > Max)
{
OnStart()
そして、ここでは、興味のあるオブジェクトを構築するためのスクリプトを記述する。例えば、楕円や図表上の文字など
} //if(オープン)
} //for(int i)
//--- 次の呼び出しのために prev_calculated の値を返す
return(rates_total)
}// OnCalculate
それは、次のようなものです。
しかし、MQLトランスレータはそのようなコードを感知しない。
このように表示されるはずです。
20分ほどで、お答えします。
動画のアップロードに40分以上と時間がかかってしまいました。
映像の読み込みに40分以上と長い時間がかかった。
また、フォーラムのセクションをごちゃ混ぜにして、mql4の質問の答えをmql5に書くこともあります。
原理的には、この場合、ファイル拡張子以外は何も変わりませんが、mql4では不要になります。
と、全く不要で役に立たないものまであります。
あなたたち子どもは、本当に何をやっているんですか、水をあおっているんですよ。
MetaEditorに入り、コマンドを入力するだけです。ファイル->作成...
これにより、異なるダミーファイルを持つフォームが表示されます。
特に、ドングルになります。
- エキスパートアドバイザー
- カスタムインジケータ
- スクリプト
- 図書館など
Expert Advisor、Custom Indicator、Scriptの3つの項目が対象です。
このダミーを比較してみましょう。
Expert Advisorでは、イベントがあります。
-OnInit(), OnDeinit(), OnTick(), OnTimer, OnChartEvent() ...すべて、これ以上ないほど。
スクリプトでは、イベントを用意しています。
- OnStart() ... 以上で終了です。
をインジケータで表示すると、イベントが発生します。
- OnInit(), OnCalculate(), OnTimer, OnChartEvent() ...すべて、これ以上ないくらい。
ここで当然問題になるのは、これらのオブジェクトをどのように結びつけるかということです。
MQLでは、これらのオブジェクト間のデータストリームは完全に分離されており、両者の間に接続は存在しないし、存在し得ないことが判明したのです。
しかも、この事実をMQLの作り手が「良し」としていることに驚かされます。
また、例えばC++の場合、BASICトランスレータやJavascriptなどのトランスレータを簡単に呼び出し、例えばAndroidプログラミング環境へ移行することができます。
MQLのフレームワークでは、indicator環境ではOnStart()コマンドを受け付けないため、いわゆる「スクリプト」を作成することすらできません。
どんな変人なんだ?
そして、そのような醜いものが、MQLには十二分にあるのです。
すべてのステップにいます。
MQLの説明を読みましたが......他にやることがないので、驚きました。
その一方で、MQLの制作者たちは、MQLはC++の子孫であると声高に宣言している。
もちろん、申し訳ないのですが、MQLのクリエイターの方々にお聞きしたいのは、「何の後継者?- その醜さに?
思わずMQLを有名な1Cプログラミング環境と比較してしまいます。また、彼らはC++の後継者であると主張している。
しかし、そこではすべてがもっとまっとうな方法で行われています。
そして、グラフィカルなオブジェクト、モジュール間の通信など、さまざまなものがあります。
そして、MQLには何があるのでしょうか?
組み込みクラスも、スレッド関連オブジェクトも......まったくない。
それに、ターミナルの数学的な殻については何も言っていない!!!
それは、驚きのために全く別の話題です!!!
ヘルプを 少し読んで、あなたが存在しないと言っているものをすべて見つけ、SBの組み込みクラスについて 読み、丁寧に助けを求める方法を学び(あなたは助けを求めた)、あなたを助けようとしている人に失礼にならない方法を学びませんか(興味なさそうにこれを記しています)...。
一般的に - 荒らし、無礼と物乞いのために24時間あなたを禁止する(あなたはすべてのあなたの文を証明するためにあなたのコードの行を示していないが、生意気にあなたの質問や発言に応答した人々を必要とする、彼らはあなたのニーズに作業コードを提供します - それはここでは通常ではない - 彼らはあなたのためにしない、助ける、注意 - 最も単純なコードを)。
悪気はないのですが......何も持たずに来た者は、意味不明なものに殺されるのです。
熱を下げるようにと注意した分、余計にね。
トレーディング、自動売買システム、トレーディング戦略のテストに関するフォーラム
MQL4に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。
アルチョム・トリシキン さん 2018.09.12 14:02
今度は、侮辱や傲慢な態度を取らずに試してみてください。macOSにmt4をインストールする方法について教えてください。
仮想マシン内専用。パラレルの高いけど便利で信頼できるのがある。
https://www.parallels.com/ru/products/desktop/
助けてくださいということです。という質問があります。
1.テストモードでは、プログラムは買い、売りともにストップロスを設定しない。しかし、保留中の注文の修正はうまくいく。
2.アカウントでリアルタイムに起動するわけではありません。
お願い、助けて。
また、プログラム作成時に発生したエラーについて、ご指摘をお願いします。
ありがとうございました。
プログラムコード
.input int Percent=50;
入力 int MAGICNUMBER=413;
//長期チャート用インジケーター定数と オシレーターの紹介
入力 int Signal_Period_long_term=6;
入力 int Fast_EMA_Period_long_term=12;
入力 int Slow_EMA_Period_long_term=24;
//短期チャートにおけるインジケータとオシレータの影響パラメータ定数
入力 int Stochastic_Kperiod_short_term=5;
入力 int Stochastic_Dperiod_short_term=3;
入力 int Stochastic_slowing_short_term=3;
input ENUM_TIMEFRAMES PERIODs_short_term=PERIOD_M5;
input ENUM_TIMEFRAMES PERIODs_long_term=PERIOD_H1;
//-----------------------------------------------------------------------------------------
//common 変数とその型
static datetime New_Time;// 現在のバーの時間
static datetime Time_Local;
double Margin_Percent; //注文を開始するための手段
double Lots;//ロット総数決定
double Lots_Volume;
//長期チャートの変数と型
double MacdCurrent_long_term;// 現在のバーのメインラインのMACDパラメータ
double MacdPrevious_long_term;// 前のバーのメインラインのMACDパラメータ
double SignalCurrent_long_term;
//短期チャート用の変数と型
double Stochastic_Current_short_term_main;/Stochastic parameters of current bar on the 5-minute chart
double Stochastic_Previous_short_term_main;/Stochastic parameters of previous bar on the 5-minute chart.
double Stochastic_Current_short_term_signal;/Stochastic parameters of current bar in the 5-minute chart
double Stochastic_Previous_short_term_signal;/Stochastic parameters of previous bar on the 5-minute chart.
ダブルStopLoss_BUY。
ダブルStopLoss_SELL。
ダブルプライス_BUY。
double Price_SELL;
//+------------------------------------------------------------------+
//| 専門家による初期化機能
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| 専門家による初期化関数
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| エキスパートティック機能
//+------------------------------------------------------------------+
void OnTick()
{
int ticket,cnt;
int total=OrdersTotal();// 注文数の決定
bool New_Bar=false; // 新しいバーをフラグにする。
//長期チャートの変数値を定義する
MacdCurrent_long_term=iMACD(NULL,PERIODs_long_term,Fast_EMA_Period_long_term,Slow_EMA_Period_long_term,Signal_Period_long_term,PRICE_TYPICAL,MODE_MAIN,1) とする。
MacdPrevious_long_term=iMACD(NULL,PERIODs_long_term,Fast_EMA_Period_long_term,Slow_EMA_Period_long_term,Signal_Period_long_term,PRICE_TYPICAL,MODE_MAIN,2) です。
SignalCurrent_long_term=iMACD(NULL,PERIODs_long_term,Fast_EMA_Period_long_term,Slow_EMA_Period_long_term,Signal_Period_long_term,PRICE_TYPICAL,MODE_SIGNAL,1) とします。
//短期チャートの変数値の決定
Stochastic_Current_short_term_main=iStochastic(NULL,PERIODs_short_term,Stochastic_Kperiod_short_term,Stochastic_Dperiod_short_term,Stochastic_slowing_short_term,MODE_SMA,0,MODE_MAIN,1) とします。
Stochastic_Previous_short_term_main=iStochastic(NULL,PERIODs_short_term,Stochastic_Kperiod_short_term,Stochastic_Dperiod_short_term,Stochastic_slowing_short_term,MODE_SMA,0,MODE_MAIN,2) とする。
Stochastic_Current_short_term_signal=iStochastic(NULL,PERIODs_short_term,Stochastic_Kperiod_short_term,Stochastic_Dperiod_short_term,Stochastic_slowing_short_term,MODE_SMA,0,MODE_SIGNAL,1) とする。
Stochastic_Previous_short_term_signal=iStochastic(NULL,PERIODs_short_term,Stochastic_Kperiod_short_term,Stochastic_Dperiod_short_term,Stochastic_slowing_short_term,MODE_SMA,0,MODE_SIGNAL,2) とする。
//共通変数の定義
Price_BUY=iHigh(NULL,PERIODs_short_term,1)+MarketInfo(NULL,MODE_STOPLEVEL)*MarketInfo(NULL,MODE_POINT) となります。
Price_SELL=iLow(NULL,PERIODs_short_term,1)-MarketInfo(NULL,MODE_STOPLEVEL)*MarketInfo(NULL,MODE_POINT) とする。
StopLoss_BUY=iLow(NULL,PERIODs_short_term,1)-MarketInfo(NULL,MODE_STOPLEVEL)*MarketInfo(NULL,MODE_POINT);
StopLoss_SELL=iHigh(NULL,PERIODs_short_term,1)+MarketInfo(NULL,MODE_STOPLEVEL)*MarketInfo(NULL,MODE_POINT);
Margin_Percent=AccountFreeMargin()*Percent/100。
Lots=NormalizeDouble(Margin_Percent/MarketInfo(Symbol(),MODE_MARGINREQUIRED),2)となります。
Lots_Volume=NormalizeDouble(MathFloor(Lots)+MarketInfo(Symbol(),MODE_LOTSTEP),2)。
//-----------------------------------------------------------------------------------------------------------------------
//----- Определение нового бара------------------------------------------------------------------------------------------
New_Time=TimeCurrent()。
Print("Time=",TimeCurrent().Time")。
Print("バーオープン時間=",iTime(NULL,PERIODs_short_term,0));
if(iTime(NULL,PERIODs_short_term,0)==New_Time) // 時刻を比較する。
{
if(iVolume(NULL,PERIODs_short_term,0)<=2) //ボリュームを比較する。
Print("バーボリューム=",ボリューム[0]);
if(iBarShift(NULL,PERIODs_short_term,TimeCurrent())==0)//Check bar index
Print("バーインデックス =",iBarShift(NULL,PERIODs_short_term,TimeCurrent()))。
New_Bar=true; // 新しいバーがキャッチされる
Print("New_Bar");
}
else if(New_Bar==false) // バーが新しいものでない場合....
{
Print("Bar is not new");
を返します。
}
//--最小ロット開設のための資金の有無を確認する
if(Margin_Percent<MarketInfo(Symbol(),MODE_MARGINREQUIRED)*(MarketInfo(Symbol(),MODE_MINLOT))
{
Print("資金が足りません。自由資金=",AccountFreeMargin());
を返します。
}
//-ロット番号の決定
if(Lots>Lots_Volume)です。
{
Lots=NormalizeDouble(Lots_Volume,2)です。
Print("Number of lots : ",Lots);
}
else if(Lots<Lots_Volume)
{
Lots=NormalizeDouble(MathFloor(Lots),2)です。
Print("Number of lots : ",Lots);
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
if(total<1)
{
if(MacdCurrent_long_term<0 && MacdCurrent_long_term>SignalCurrent_long_term)
Print("Condition is true for BUY");
{
//+---------------------------------------------------------------------------+
//|買いポジションのロングを建てる条件のみ||||。
//+---------------------------------------------------------------------------+
if(Stochastic_Current_short_term_main<Stochastic_Current_short_term_signal && Stochastic_Previous_short_term_main>=Stochastic_Previous_short_term_signal)
{
ticket=OrderSend(Symbol(),OP_BUYSTOP,Lots,Price_BUY,3,0,0,NULL,MAGICNUMBER,0,BLUE)。
if(ticket>0)//オープンポジションのチェック
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
{
Print("BUY order open : ",OrderOpenPrice());
を返します。
}
else Print("BUY order open error : ",GetLastError());
を返します。
}
}
}
if(MacdCurrent_long_term>0 && MacdCurrent_long_term<SignalCurrent_long_term)
Print("Condition is true for SELL");
{
//+---------------------------------------------------------------------------+
//| 空売りのポジションを開くための条件
//+---------------------------------------------------------------------------+
if(Stochastic_Current_short_term_main>Stochastic_Current_short_term_signal && Stochastic_Previous_short_term_main<=Stochastic_Previous_short_term_signal)
{
ticket=OrderSend(Symbol(),OP_SELLSTOP,Lots,Price_SELL,3,0,0,NULL,MAGICNUMBER,0,Green).のようになります。
if(ticket>0)//オープンポジションのチェック
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES))
{
Print("SELL order open : ",OrderOpenPrice());
を返します。
}
else Print("Error opening SELL order : ",GetLastError());
を返します。
}
}
}
}
//+---------------------------------------------------------------------------+
//| 注文変更条件
//+---------------------------------------------------------------------------+
for(cnt=0;cnt<total;cnt++)
//+------------------------------------------------------------------+
//||
//+------------------------------------------------------------------+
{
if(!OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
を続ける。
if(OrderMagicNumber()==MAGICNUMBER && // オーダーのマジックナンバーをチェックする)
OrderSymbol()==Symbol()) // 注文記号を確認する
{
//--- ロングポジションを開設
if(OrderType()==OP_BUYSTOP)
{
if(OrderOpenPrice()<Price_BUY && Ask<Price_BUY)
{
if(OrderModify(OrderTicket(),Price_BUY,0,0,Blue))を実行する。
Print("Price_BUY注文が正常に変更されました。");
else Print("BUYStop注文の修正に失敗しました。エラーコード=",GetLastError());
を返します。
}
else Print("Modification price is higher than order price");
を返します。
}
if(オーダータイプ()==OP_SELLSTOP)
{
if(Order OpenPrice()<Price_SELL && Bid>Price_SELL)
{
if(OrderModify(OrderTicket(),Price_SELL,0,0,Green))
Print("Price_SELL注文が正常に変更されました。");
else Print("注文SELLStopの修正に失敗しました。エラーコード=",GetLastError();
を返します。
}
}
if(OrderType()==OP_BUY)
{
if(OrderStopLoss()<StopLoss_BUY && StopLoss_BUY<Ask)
{
if(OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss_BUY,0,0,Blue))
Print("Price_BUY注文価格の変更に成功しました。");
else Print("BUY注文の変更に失敗しました。エラーコード=",GetLastError());
を返します。
}
}
if(オーダータイプ()==OP_SELL)
{
if(OrderStopLoss()>StopLoss_SELL && StopLoss_SELL>Bid)
{
if(OrderModify(OrderTicket(),OrderOpenPrice(),StopLoss_SELL,0,0,Green))
Print("Price_SELL注文価格の変更に成功しました。");
else Print("SELL注文の修正エラー")エラーコード=",GetLastError();
を返します。
}
}
}
}
}
//+------------------------------------------------------------------+
時間足の最後のローソク足が表示されているときに、その日の高値と安値が描画されないというインジケータのバグを修正してください。
https://prnt.sc/kut6xo
https://prnt.sc/kut79b
助けてくださいということです。という質問があります。
1.テストモードでは、プログラムは買い、売りともにストップロスを設定しない。しかし、それは保留中の注文を修正します。
2.アカウントでリアルタイムに起動するわけではありません。
このように
はANDコードを修正するので、正しく挿入してください(Alt+S)。