380 lines
29 KiB
Text
380 lines
29 KiB
Text
// チャートにトレード履歴表示・データ表示用
|
|
double tes = 0.0; // 外付け手数料(PIPS換算)
|
|
int sf, tof;
|
|
datetime hf;
|
|
double totalpips = 0, ProfitFactor = 0;
|
|
double plus_profit = 0, minus_profit = 0;
|
|
double minus_count = 0, plus_count = 0;
|
|
double RRR, WinPer;
|
|
double TradeCounts;
|
|
|
|
int OnInit()
|
|
{
|
|
// トレード履歴をチャートに表示(ライン・pips)
|
|
history();
|
|
PosHis();
|
|
}
|
|
|
|
void OnTick()
|
|
{
|
|
// チャートにトレード線とpips表示
|
|
if (IsTesting() == false || IsVisualMode() == true)
|
|
{
|
|
if (sf != Seconds() && OrdersTotal() > 0)
|
|
{
|
|
PosHis();
|
|
sf = Seconds();
|
|
}
|
|
|
|
if ((hf != iTime((string)0, 60, 0) && Seconds() > 30) || tof != OrdersHistoryTotal())
|
|
{
|
|
history();
|
|
hf = iTime((string)0, 60, 0);
|
|
tof = OrdersHistoryTotal();
|
|
}
|
|
}
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
//| チャートにトレード履歴表示(チャートコメントは別処理バージョン) |
|
|
//+------------------------------------------------------------------+
|
|
void PosHis()
|
|
{
|
|
int res;
|
|
double pips = 0;
|
|
|
|
for (int i = OrdersTotal() - 1; i >= 0; i--)
|
|
{
|
|
res = OrderSelect(i, SELECT_BY_POS);
|
|
if (OrderSymbol() != Symbol() || OrderType() > 1 || OrderMagicNumber() != MagicNumber)
|
|
continue;
|
|
pips += trend((string)OrderTicket(), OrderOpenTime(), OrderOpenPrice(), Time[0], OrderType() == 0 ? Bid : Ask, OrderType());
|
|
}
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
void history()
|
|
{
|
|
int res;
|
|
totalpips = 0;
|
|
plus_profit = 0;
|
|
minus_profit = 0;//, ProfitFactor = 0;
|
|
minus_count = 0;
|
|
plus_count = 0;
|
|
TradeCounts = 0;
|
|
|
|
// トレード履歴を検索
|
|
for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
|
|
{
|
|
res = OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
|
|
if (OrderSymbol() != Symbol() || OrderType() > 1 || OrderMagicNumber() != MagicNumber)
|
|
continue;
|
|
|
|
// 合計pips計算
|
|
totalpips += trend((string)OrderTicket(), OrderOpenTime(), OrderOpenPrice(), OrderCloseTime(), OrderClosePrice(), OrderType());
|
|
|
|
// プロフィットファクター・RRR・勝率計算
|
|
if (OrderProfit() < 0)
|
|
{
|
|
minus_profit -= OrderProfit();
|
|
minus_count += 1;
|
|
}
|
|
else if (OrderProfit() >= 0)
|
|
{
|
|
plus_profit += OrderProfit();
|
|
plus_count += 1;
|
|
}
|
|
if (minus_profit != 0 && plus_count != 0 && minus_count != 0)
|
|
{
|
|
ProfitFactor = plus_profit / minus_profit;
|
|
RRR = (plus_profit / plus_count) / (minus_profit / minus_count);
|
|
WinPer = (plus_count * 100) / (plus_count + minus_count);
|
|
}
|
|
TradeCounts = minus_count + plus_count;
|
|
}
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
double trend(string obj_name, datetime Time1, double Close1, datetime Time2, double Close2, int type)
|
|
{
|
|
double pips = (double)DoubleToStr((type == 0 ? Close2 - Close1 : Close1 - Close2) / Point() * 0.1 - tes, 1);
|
|
int Shift2 = iBarShift(NULL, 0, Time2);
|
|
datetime Timex = iTime(NULL, 0, Shift2 + 1);
|
|
|
|
// トレード線
|
|
ObjectDelete("hislt" + obj_name);
|
|
ObjectCreate(0, "hislt" + obj_name, OBJ_TREND, 0, Time1, Close1, Time2, Close2);
|
|
ObjectSetInteger(0, "hislt" + obj_name, OBJPROP_COLOR, type == 0 ? clrDodgerBlue : clrOrangeRed);
|
|
ObjectSetInteger(0, "hislt" + obj_name, OBJPROP_STYLE, 0);
|
|
ObjectSetInteger(0, "hislt" + obj_name, OBJPROP_WIDTH, 2);
|
|
ObjectSetInteger(0, "hislt" + obj_name, OBJPROP_SELECTABLE, false); // オブジェクトの選択可否設定
|
|
ObjectSetInteger(0, "hislt" + obj_name, OBJPROP_RAY_RIGHT, false); // 右に線を延長
|
|
|
|
// トレード線内のpips表示
|
|
// 文字本体
|
|
ObjectDelete("hislx" + obj_name);
|
|
ObjectCreate(0, "hislx" + obj_name, OBJ_TEXT, 0, Timex, Close2);
|
|
ObjectSetInteger(0, "hislx" + obj_name, OBJPROP_COLOR, pips < 0 ? clrOrangeRed : !IsTesting()? clrLime : clrYellow);//type == 0 ? BuyColor : SellColor);
|
|
ObjectSetInteger(0, "hislx" + obj_name, OBJPROP_SELECTABLE, false); // オブジェクトの選択可否設定
|
|
ObjectSetInteger(0, "hislx" + obj_name, OBJPROP_FONTSIZE, 12); // フォントサイズ
|
|
ObjectSetInteger(0, "hislx" + obj_name, OBJPROP_ANCHOR, ANCHOR_RIGHT); // 描画位置
|
|
ObjectSetString(0, "hislx" + obj_name, OBJPROP_TEXT, DoubleToStr(pips, 1)); // 表示するテキスト
|
|
ObjectSetString(0, "hislx" + obj_name, OBJPROP_FONT, "Segoe UI Semibold"); // フォント
|
|
|
|
return(pips);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// バリエーション
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
// チャートにトレード履歴表示用
|
|
double tes = 0.0; // 外付け手数料(PIPS換算)
|
|
color BuyColor = DodgerBlue;
|
|
color SellColor = OrangeRed;
|
|
color GainColor = Lime;
|
|
color LossColor = OrangeRed;
|
|
int sf, tof;
|
|
datetime hf;
|
|
double totalpips = 0, ProfitFactor = 0;
|
|
|
|
int OnInit()
|
|
{
|
|
// トレード履歴をチャートに表示(ライン・pips)
|
|
history();
|
|
PosHis();
|
|
}
|
|
|
|
void OnTick()
|
|
{
|
|
// チャートにトレード線とpips表示
|
|
if (IsTesting() == false || IsVisualMode() == true)
|
|
{
|
|
if (sf != Seconds() && OrdersTotal() > 0)
|
|
{
|
|
PosHis();
|
|
sf = Seconds();
|
|
}
|
|
|
|
if ((hf != iTime((string)0, 60, 0) && Seconds() > 30) || tof != OrdersHistoryTotal())
|
|
{
|
|
history();
|
|
hf = iTime((string)0, 60, 0);
|
|
tof = OrdersHistoryTotal();
|
|
}
|
|
}
|
|
}
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| チャートにトレード履歴表示(チャートコメント表示処理も一緒) |
|
|
//+------------------------------------------------------------------+
|
|
void PosHis()
|
|
{
|
|
int res;
|
|
double pips = 0;
|
|
|
|
for (int i = OrdersTotal() - 1; i >= 0; i--)
|
|
{
|
|
res = OrderSelect(i, SELECT_BY_POS);
|
|
if (OrderSymbol() != Symbol() || OrderType() > 1 || OrderMagicNumber() != MagicNumber)
|
|
continue;
|
|
pips += trend((string)OrderTicket(), OrderOpenTime(), OrderOpenPrice(), Time[0], OrderType() == 0 ? Bid : Ask, OrderType());
|
|
}
|
|
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
void history()
|
|
{
|
|
totalpips = 0;
|
|
int res;
|
|
double plus_profit = 0, minus_profit = 0;//, ProfitFactor = 0;
|
|
|
|
// トレード履歴を検索
|
|
for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
|
|
{
|
|
res = OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
|
|
if (OrderSymbol() != Symbol() || OrderType() > 1 || OrderMagicNumber() != MagicNumber)
|
|
continue;
|
|
|
|
// 合計pips計算
|
|
totalpips += trend((string)OrderTicket(), OrderOpenTime(), OrderOpenPrice(), OrderCloseTime(), OrderClosePrice(), OrderType());
|
|
|
|
// プロフィットファクター計算
|
|
if (OrderProfit() < 0) minus_profit -= OrderProfit();
|
|
else if (OrderProfit() >= 0) plus_profit += OrderProfit();
|
|
if (minus_profit != 0) ProfitFactor = plus_profit / minus_profit;
|
|
}
|
|
|
|
// 値表示
|
|
string Comment01 = "Profit (pips) : " + DoubleToStr(totalpips, 1);
|
|
string Comment02 = (plus_profit == 0 || minus_profit == 0? "Profit factor : ---" : "Profit factor : " + DoubleToStr(ProfitFactor, 2));
|
|
CommentLabel2("totalpips", Comment01, 6, 136, 8);
|
|
CommentLabel2("profitfactor", Comment02, 6, 154, 8);
|
|
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
void CommentLabel2(string ComName2, string ComText2, int ComPos_x2, int ComPos_y2, int ComSize2)
|
|
{
|
|
// 値の仕様
|
|
ObjectCreate(ComName2, OBJ_LABEL, 0, 0, 0);
|
|
ObjectSetString (0, ComName2, OBJPROP_TEXT, ComText2);
|
|
ObjectSetInteger(0, ComName2, OBJPROP_XDISTANCE, ComPos_x2);
|
|
ObjectSetInteger(0, ComName2, OBJPROP_YDISTANCE, ComPos_y2);
|
|
ObjectSetInteger(0, ComName2, OBJPROP_FONTSIZE, ComSize2);
|
|
ObjectSetString (0, ComName2, OBJPROP_FONT, "Segoe UI");
|
|
ObjectSetInteger(0, ComName2, OBJPROP_HIDDEN, true);
|
|
ObjectSetInteger(0, ComName2, OBJPROP_STATE, false);
|
|
ObjectSetInteger(0, ComName2, OBJPROP_BACK, true);
|
|
ObjectSetInteger(0, ComName2, OBJPROP_SELECTABLE, false);
|
|
ObjectSetInteger(0, ComName2, OBJPROP_CORNER, CORNER_RIGHT_UPPER);
|
|
ObjectSetInteger(0, ComName2, OBJPROP_ANCHOR, ANCHOR_RIGHT_UPPER);
|
|
ObjectSetInteger(0, "totalpips", OBJPROP_COLOR, totalpips < 0? clrOrangeRed : clrWhite);
|
|
ObjectSetInteger(0, "profitfactor", OBJPROP_COLOR, 0 < ProfitFactor && ProfitFactor < 1? clrOrangeRed : clrWhite);
|
|
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
double trend(string obj_name, datetime Time1, double Close1, datetime Time2, double Close2, int type)
|
|
{
|
|
double pips = (double)DoubleToStr((type == 0 ? Close2 - Close1 : Close1 - Close2) / Point() * 0.1 - tes, 1);
|
|
int Shift2 = iBarShift(NULL, 0, Time2);
|
|
datetime Timex = iTime(NULL, 0, Shift2 + 1);
|
|
|
|
// トレード線
|
|
ObjectDelete("hislt" + obj_name);
|
|
ObjectCreate(0, "hislt" + obj_name, OBJ_TREND, 0, Time1, Close1, Time2, Close2);
|
|
ObjectSetInteger(0, "hislt" + obj_name, OBJPROP_COLOR, type == 0 ? BuyColor : SellColor);
|
|
ObjectSetInteger(0, "hislt" + obj_name, OBJPROP_STYLE, 0);
|
|
ObjectSetInteger(0, "hislt" + obj_name, OBJPROP_WIDTH, 0);
|
|
ObjectSetInteger(0, "hislt" + obj_name, OBJPROP_SELECTABLE, false); // オブジェクトの選択可否設定
|
|
ObjectSetInteger(0, "hislt" + obj_name, OBJPROP_RAY_RIGHT, false); // 右に線を延長
|
|
|
|
// トレード線内のpips表示
|
|
// 文字本体
|
|
ObjectDelete("hislx" + obj_name);
|
|
ObjectCreate(0, "hislx" + obj_name, OBJ_TEXT, 0, Timex, Close2);
|
|
ObjectSetInteger(0, "hislx" + obj_name, OBJPROP_COLOR, pips < 0 ? LossColor : GainColor);//type == 0 ? BuyColor : SellColor);
|
|
ObjectSetInteger(0, "hislx" + obj_name, OBJPROP_SELECTABLE, false); // オブジェクトの選択可否設定
|
|
ObjectSetInteger(0, "hislx" + obj_name, OBJPROP_FONTSIZE, 12); // フォントサイズ
|
|
ObjectSetInteger(0, "hislx" + obj_name, OBJPROP_ANCHOR, ANCHOR_RIGHT); // 描画位置
|
|
ObjectSetString(0, "hislx" + obj_name, OBJPROP_TEXT, DoubleToStr(pips, 1)); // 表示するテキスト
|
|
ObjectSetString(0, "hislx" + obj_name, OBJPROP_FONT, "Segoe UI Semibold"); // フォント
|
|
|
|
return(pips);
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//+------------------------------------------------------------------+
|
|
//| チャートにトレード履歴表示(線の中央にpips表示) |
|
|
//+------------------------------------------------------------------+
|
|
void PosHis()
|
|
{
|
|
int res;
|
|
double pips = 0;
|
|
|
|
for (int i = OrdersTotal() - 1; i >= 0; i--)
|
|
{
|
|
res = OrderSelect(i, SELECT_BY_POS);
|
|
if (OrderSymbol() != Symbol() || OrderType() > 1 || OrderMagicNumber() != MagicNumber)
|
|
continue;
|
|
pips += trend((string)OrderTicket(), OrderOpenTime(), OrderOpenPrice(), Time[0], OrderType() == 0 ? Bid : Ask, OrderType());
|
|
}
|
|
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
void history()
|
|
{
|
|
totalpips = 0;
|
|
int res;
|
|
double plus_profit = 0, minus_profit = 0;//, ProfitFactor = 0;
|
|
|
|
// トレード履歴を検索
|
|
for (int i = OrdersHistoryTotal() - 1; i >= 0; i--)
|
|
{
|
|
res = OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
|
|
if (OrderSymbol() != Symbol() || OrderType() > 1 || OrderMagicNumber() != MagicNumber)
|
|
continue;
|
|
|
|
// 合計pips計算
|
|
totalpips += trend((string)OrderTicket(), OrderOpenTime(), OrderOpenPrice(), OrderCloseTime(), OrderClosePrice(), OrderType());
|
|
|
|
// プロフィットファクター計算
|
|
if (OrderProfit() < 0) minus_profit -= OrderProfit();
|
|
else if (OrderProfit() >= 0) plus_profit += OrderProfit();
|
|
if (minus_profit != 0) ProfitFactor = plus_profit / minus_profit;
|
|
}
|
|
|
|
// 値表示
|
|
string Comment01 = "Profit (pips) : " + DoubleToStr(totalpips, 1);
|
|
string Comment02 = (plus_profit == 0 || minus_profit == 0? "Profit factor : ---" : "Profit factor : " + DoubleToStr(ProfitFactor, 2));
|
|
CommentLabel2("totalpips", Comment01, 6, 136, 8);
|
|
CommentLabel2("profitfactor", Comment02, 6, 154, 8);
|
|
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
void CommentLabel2(string ComName2, string ComText2, int ComPos_x2, int ComPos_y2, int ComSize2)
|
|
{
|
|
// 値の仕様
|
|
ObjectCreate(ComName2, OBJ_LABEL, 0, 0, 0);
|
|
ObjectSetString (0, ComName2, OBJPROP_TEXT, ComText2);
|
|
ObjectSetInteger(0, ComName2, OBJPROP_XDISTANCE, ComPos_x2);
|
|
ObjectSetInteger(0, ComName2, OBJPROP_YDISTANCE, ComPos_y2);
|
|
ObjectSetInteger(0, ComName2, OBJPROP_FONTSIZE, ComSize2);
|
|
ObjectSetString (0, ComName2, OBJPROP_FONT, "Segoe UI");
|
|
ObjectSetInteger(0, ComName2, OBJPROP_HIDDEN, true);
|
|
ObjectSetInteger(0, ComName2, OBJPROP_STATE, false);
|
|
ObjectSetInteger(0, ComName2, OBJPROP_BACK, true);
|
|
ObjectSetInteger(0, ComName2, OBJPROP_SELECTABLE, false);
|
|
ObjectSetInteger(0, ComName2, OBJPROP_CORNER, CORNER_RIGHT_UPPER);
|
|
ObjectSetInteger(0, ComName2, OBJPROP_ANCHOR, ANCHOR_RIGHT_UPPER);
|
|
ObjectSetInteger(0, "totalpips", OBJPROP_COLOR, totalpips < 0? clrOrangeRed : clrWhite);
|
|
ObjectSetInteger(0, "profitfactor", OBJPROP_COLOR, 0 < ProfitFactor && ProfitFactor < 1? clrOrangeRed : clrWhite);
|
|
|
|
}
|
|
//+------------------------------------------------------------------+
|
|
double trend(string obj_name, datetime Time1, double Close1, datetime Time2, double Close2, int type)
|
|
{
|
|
double pips = (double)DoubleToStr((type == 0 ? Close2 - Close1 : Close1 - Close2) / Point() * 0.1 - tes, 1);
|
|
int Shift1 = iBarShift(NULL, 0, Time1);
|
|
int Shift2 = iBarShift(NULL, 0, Time2);
|
|
datetime Timex = iTime(NULL, 0, (Shift1 + Shift2) /2);
|
|
|
|
// トレード線
|
|
ObjectDelete("hislt" + obj_name);
|
|
ObjectCreate(0, "hislt" + obj_name, OBJ_TREND, 0, Time1, Close1, Time2, Close2);
|
|
ObjectSetInteger(0, "hislt" + obj_name, OBJPROP_COLOR, type == 0 ? BuyColor : SellColor);
|
|
ObjectSetInteger(0, "hislt" + obj_name, OBJPROP_STYLE, 0);
|
|
ObjectSetInteger(0, "hislt" + obj_name, OBJPROP_WIDTH, 0);
|
|
ObjectSetInteger(0, "hislt" + obj_name, OBJPROP_SELECTABLE, false); // オブジェクトの選択可否設定
|
|
ObjectSetInteger(0, "hislt" + obj_name, OBJPROP_RAY_RIGHT, false); // 右に線を延長
|
|
|
|
// トレード線内のpips表示
|
|
// 文字本体
|
|
ObjectDelete("hislx" + obj_name);
|
|
ObjectCreate(0, "hislx" + obj_name, OBJ_TEXT, 0, Timex, (Close1 + Close2)/2);
|
|
ObjectSetInteger(0, "hislx" + obj_name, OBJPROP_COLOR, pips < 0 ? LossColor : GainColor);//type == 0 ? BuyColor : SellColor);
|
|
ObjectSetInteger(0, "hislx" + obj_name, OBJPROP_SELECTABLE, false); // オブジェクトの選択可否設定
|
|
ObjectSetInteger(0, "hislx" + obj_name, OBJPROP_FONTSIZE, 12); // フォントサイズ
|
|
ObjectSetInteger(0, "hislx" + obj_name, OBJPROP_ANCHOR, ANCHOR_CENTER); // 描画位置
|
|
ObjectSetString(0, "hislx" + obj_name, OBJPROP_TEXT, DoubleToStr(pips, 1)); // 表示するテキスト
|
|
ObjectSetString(0, "hislx" + obj_name, OBJPROP_FONT, "Segoe UI Semibold"); // フォント
|
|
|
|
return(pips);
|
|
}
|
|
//+------------------------------------------------------------------+
|