} //+------------------------------------------------------------------+ //| Expert tick function | //+------------------------------------------------------------------+ voidOnTick() { Profit=LastProfit(iTime(_Symbol,TimeFrame,0),Symbols,Magic,ModeType); prev_balans=Balans(0,iTime(_Symbol,TimeFrame,0)); if(prev_balans!=0.0)procent=Profit/prev_balans*100.0; Comment( "\nTime = ",iTime(_Symbol,TimeFrame,0), "\nProfit = ",DoubleToStr(Profit,2), "\nprev_balans = ",DoubleToStr(prev_balans,2), "\nprocent = ",DoubleToStr(procent,4)," %" ); } //+------------------------------------------------------------------+ double LastProfit( datetime time, // Дата, представленная в виде количества секунд, прошедших после 00:00 1 января 1970 года. string symbol=NULL, // символ, если NULL то любой символ int magic=-1, // идентификатор, если -1 то любой идентификатор int cmd=-1// торговая операция, если -1 любая торговая операция ) { double profit=0; int total=OrdersHistoryTotal(); for(int i=total-1;i>=0;i--) { if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue; if(OrderSymbol()==symbol || symbol!=NULL) { if(OrderMagicNumber()==magic || magic==-1) { if(OrderType()==cmd || cmd==-1) { if(OrderCloseTime()<time)continue; profit+=OrderProfit()+OrderCommission()+OrderSwap(); } } } } return(profit); } //+------------------------------------------------------------------+ double Balans( datetime start_time,// C какой даты. Дата, представленная в виде количества секунд, прошедших после 00:00 1 января 1970 года. datetime stop_time,// По какую дату. Дата, представленная в виде количества секунд, прошедших после 00:00 1 января 1970 года. ) { double profit=0; int total=OrdersHistoryTotal(); for(int i=0; i<total; i++) { if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue; if(OrderCloseTime()<start_time || OrderCloseTime()>stop_time)continue; profit+=OrderProfit()+OrderCommission()+OrderSwap(); } return(profit); } //+------------------------------------------------------------------+
こんにちは。
お願いがあるのですが?
クローズドポジション の場合、その日の初めからの損失が10%だったというのは、どうすればわかるのでしょうか?
このExpert Advisorは、設定した期間の損益の割合を左上に表示します。
//| test02.mq4 |
//| Sergey Gritsay |
//| https://www.mql5.com/ru/users/sergey1294 |
//+------------------------------------------------------------------+
#property copyright "Sergey Gritsay"
#property link "https://www.mql5.com/ru/users/sergey1294"
#property version "1.00"
#property strict
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
enum mode_type
{
BUY=OP_BUY,
SELL=OP_SELL,
ALL = -1
};
input string Symbols=NULL;
input int Magic=-1;//Identification number
input mode_type ModeType=ALL;
input ENUM_TIMEFRAMES TimeFrame=PERIOD_D1;
double procent=0.0;
double prev_balans=0.0;
double Profit=0.0;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---
//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
Profit=LastProfit(iTime(_Symbol,TimeFrame,0),Symbols,Magic,ModeType);
prev_balans=Balans(0,iTime(_Symbol,TimeFrame,0));
if(prev_balans!=0.0)procent=Profit/prev_balans*100.0;
Comment(
"\nTime = ",iTime(_Symbol,TimeFrame,0),
"\nProfit = ",DoubleToStr(Profit,2),
"\nprev_balans = ",DoubleToStr(prev_balans,2),
"\nprocent = ",DoubleToStr(procent,4)," %"
);
}
//+------------------------------------------------------------------+
double LastProfit(
datetime time, // Дата, представленная в виде количества секунд, прошедших после 00:00 1 января 1970 года.
string symbol=NULL, // символ, если NULL то любой символ
int magic=-1, // идентификатор, если -1 то любой идентификатор
int cmd=-1 // торговая операция, если -1 любая торговая операция
)
{
double profit=0;
int total=OrdersHistoryTotal();
for(int i=total-1;i>=0;i--)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
if(OrderSymbol()==symbol || symbol!=NULL)
{
if(OrderMagicNumber()==magic || magic==-1)
{
if(OrderType()==cmd || cmd==-1)
{
if(OrderCloseTime()<time)continue;
profit+=OrderProfit()+OrderCommission()+OrderSwap();
}
}
}
}
return(profit);
}
//+------------------------------------------------------------------+
double Balans(
datetime start_time,// C какой даты. Дата, представленная в виде количества секунд, прошедших после 00:00 1 января 1970 года.
datetime stop_time,// По какую дату. Дата, представленная в виде количества секунд, прошедших после 00:00 1 января 1970 года.
)
{
double profit=0;
int total=OrdersHistoryTotal();
for(int i=0; i<total; i++)
{
if(!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))continue;
if(OrderCloseTime()<start_time || OrderCloseTime()>stop_time)continue;
profit+=OrderProfit()+OrderCommission()+OrderSwap();
}
return(profit);
}
//+------------------------------------------------------------------+
...
このアドバイザーは、設定された期間の損益の割合を左上に表示します
ありがとうございます。
全期間での負けポジション数を計算する機能があります。
今日 決済した負け ポジションの数を連続して見るには、何を変更すればよいのでしょうか?
{
int PosCnt = 0;
int cnt = HistoryTotal();
for (int i = cnt-1; i >=0; i--) {
if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
if (OrderSymbol() != Symbol()) continue;
if (OrderMagicNumber() != Magic) continue;
int type = OrderType();
if (type != OP_BUY && type != OP_SELL) continue;
if (OrderProfit()+OrderSwap()+OrderCommission() > 0) break;
PosCnt++;
}
return (PosCnt);
}
ありがとうございます。
負けポジションの数を時系列でカウントする機能があります。
今日 連続で決済した負け ポジションの数を調べるには、何を変更すればよいのでしょうか?
{
int PosCnt = 0;
int cnt = HistoryTotal();
for (int i = cnt-1; i >=0; i--) {
if (!OrderSelect(i, SELECT_BY_POS, MODE_HISTORY)) continue;
if (OrderSymbol() != Symbol()) continue;
if (OrderMagicNumber() != Magic) continue;
int type = OrderType();
if (type != OP_BUY && type != OP_SELL) continue;
if (OrderProfit()+OrderSwap()+OrderCommission() > 0) break;
PosCnt++;
}
return (PosCnt);
}
もう一つ条件を追加します。注文の終了時刻が現在のD1ローソクの開始時刻より 短ければ、続行 します。
ありがとう ございます。
ありがとう ございます。
こうはいかない。
こんな感じ -OrderSymbol()
あるいはこんな感じ。
こうはいかない。
こんな感じ -OrderSymbol()
ありがとうございます。
拝啓。EAの入力パラメータ ウィンドウにテキストを追加する方法を教えてください。
input bool MetaQuotes = true;
input double MetaQuotes = 20.3;
input string MetaQuotes = "Corp";
input bool MetaQuotes = true;
input double MetaQuotes = 20.3;
input string MetaQuotes = "Corp";
リプでありがとう+。外部入力 変数についてのチュートリアルを読んで、それがあまりよく 説明されていないことを把握しました。例を見れば一目瞭然、一目瞭然です。
リプでありがとう+。外部入力 変数についてのチュートリアルを読んで、それがあまりよく 説明されていないことを把握しました。例を見れば一目瞭然です。
各行にコメントを付ければ、もっと面白くなると思います。
input bool MetaQuotes2 = true; // Описание входного параметра 2
input double MetaQuotes3 = 20.3; // Описание входного параметра 3
input string MetaQuotes4 = "Corp"; // Описание входного параметра 4
で、boolの 代わりにenumerationを作って使うと、さらに面白くなります。
{
enYes = 1, // Да
enNo = 0, // Нет
};
input int MetaQuotes1 = 30; // Описание входного параметра 1
input enumYN MetaQuotes2 = enYes; // Описание входного параметра 2
input double MetaQuotes3 = 20.3; // Описание входного параметра 3
input string MetaQuotes4 = "Corp"; // Описание входного параметра 4
とsinputで 、最適化の対象となる変数のリストから除外することができます。例えば、この文脈の変数MetaQuotes4は最適化のために必要ではないので、除外することができる。
{
enYes = 1, // Да
enNo = 0, // Нет
};
input int MetaQuotes1 = 30; // Описание входного параметра 1
input enumYN MetaQuotes2 = enYes; // Описание входного параметра 2
input double MetaQuotes3 = 20.3; // Описание входного параметра 3
sinput string MetaQuotes4 = "Corp"; // Описание входного параметра 4