交易危机

 找回密码
 快捷注册(禁q号)

QQ登录

只需一步,快速开始

搜索
广告位
查看: 2062|回复: 9
打印 上一主题 下一主题

[其他] 分享一个回顾交易历史的指标

[复制链接]

8

主题

2314

积分

0

精华

中级操盘手

金钱
2314 美元
权重
0
跳转到指定楼层
楼主
发表于 2017-1-9 13:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,指标也能算出凯利公式的仓位




#property indicator_chart_window
extern color TextColor=Red;
int cnt;
string TextBarString,DotBarString,HLineBarString,VLineBarString;

int init()
   {
      return(0);
   }

int deinit()
   {
      Comment("");
      ObjectsDeleteAll(0);
      return(0);
   }
int start()
   {
      iMain();
      return(0);
   }

void iMain()
   {
      //定义统计变量
      int BuyHistoryOrders,SellHistoryOrders,ProfitHistoryOrders,HistoryOrderTotal;//买入历史订单、卖出历史订单、盈利历史订单、历史订单总数
      int WinHistory,LossHistory; //历史盈利/亏损单累计
      double TotalHistoryLots;//历史交易总手数
      double TotalHistoryProfit,TotalHistoryLoss;//盈利总数、亏损总数变量
      color myLineColor=Blue;
     
      iDisplayInfo("Times","动态报价时间:"+TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS)+" 星期"+DayOfWeek(),0,4,15,9,"Verdana",TextColor);
      //遍历历史订单,计算相关信息
      HistoryOrderTotal=OrdersHistoryTotal(); //统计历史订单总数
      for (cnt=0;cnt<=HistoryOrderTotal-1;cnt++)
         {
            if (OrderSelect(cnt,SELECT_BY_POS,MODE_HISTORY))
               {
                  if (OrderType()==OP_BUY)
                     {
                        BuyHistoryOrders=BuyHistoryOrders+1;
                        if (OrderProfit()>0)  myLineColor=Blue;
                        if (OrderProfit()<0)  myLineColor=Red;
                        if (OrderSymbol()==Symbol())
                           {
                              iTwoPointsLine(TimeToStr(OrderOpenTime()),OrderOpenTime(),OrderOpenPrice(),OrderCloseTime(),OrderClosePrice(),2,myLineColor);
                              iDrawSign("Text",iBarShift(OrderSymbol(),0,OrderOpenTime()),OrderOpenPrice(),myLineColor,0,DoubleToStr(OrderTicket(),0)+" buy",8);
                           }
                     }
                  if (OrderType()==OP_SELL)
                     {
                        SellHistoryOrders=SellHistoryOrders+1;
                        if (OrderProfit()>0)  myLineColor=Blue;
                        if (OrderProfit()<0)  myLineColor=Red;
                        if (OrderSymbol()==Symbol())
                           {
                              iTwoPointsLine(TimeToStr(OrderOpenTime()),OrderOpenTime(),OrderOpenPrice(),OrderCloseTime(),OrderClosePrice(),3,myLineColor);
                              iDrawSign("Text",iBarShift(OrderSymbol(),0,OrderOpenTime()),OrderOpenPrice(),myLineColor,0,DoubleToStr(OrderTicket(),0)+" sell",8);
                           }
                     }
                  if (OrderProfit()>0)
                     {
                        WinHistory=WinHistory+1;
                        TotalHistoryProfit=TotalHistoryProfit+OrderProfit();
                     }
                  if (OrderProfit()<0)
                     {
                        LossHistory=LossHistory+1;
                        TotalHistoryLoss=TotalHistoryLoss+OrderProfit();
                     }
                  TotalHistoryLots=TotalHistoryLots+OrderLots();
               }
         }
      iDisplayInfo("HistoryOrderTotal", "历史交易单总计:"+HistoryOrderTotal+"  (其中买入单:"+BuyHistoryOrders+"  卖出单:"+SellHistoryOrders+")",0,4,35,9,"",TextColor);
      double myWinRate=(WinHistory*1.00)/(HistoryOrderTotal*1.00)*100; //胜率变量,int类型转double类型
      iDisplayInfo("HistoryWinLoss", "历史盈利单总计:"+WinHistory+"  历史亏损单:"+LossHistory+"  胜率:"+DoubleToStr(myWinRate,2)+"%",0,4,50,9,"",TextColor);
      iDisplayInfo("HistoryLots", "历史总下单量:"+DoubleToStr(TotalHistoryLots,2)+"手"+"  总盈利:"+DoubleToStr(TotalHistoryProfit,2)+"  总亏损:"+DoubleToStr(TotalHistoryLoss,2),0,4,65,9,"",TextColor);
      double myOdds=(TotalHistoryProfit/WinHistory)/(-TotalHistoryLoss/LossHistory); //计算赔率=平均盈利/平均亏损
      double myKelly=((myOdds+1)*(myWinRate/100)-1)/myOdds;
      if (myKelly<0) myKelly=-myKelly;
      double myMaxLots=AccountBalance()*myKelly/MarketInfo(Symbol(), MODE_MARGINREQUIRED);
      iDisplayInfo("AverageRate", "平均盈利:"+DoubleToStr(TotalHistoryProfit/WinHistory,2)+"  平均亏损:"+DoubleToStr(TotalHistoryLoss/LossHistory,2),0,4,80,9,"",TextColor);
      iDisplayInfo("Kelly", "赔率:"+DoubleToStr(myOdds,2)+"  凯利指标:"+DoubleToStr(myKelly*100,2)+"%"+
                   "  持仓限制:"+DoubleToStr(myMaxLots,2)+"手",0,4,95,9,"",TextColor);
      //持仓警告
      double myLots;
      for (cnt=0;cnt<OrdersTotal();cnt++)
         {
            if (OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
               {
                  myLots=myLots+OrderLots();
                  //画持仓单线段,动态
                  if (OrderProfit()>0)  myLineColor=Blue;
                  if (OrderProfit()<0)  myLineColor=Red;
                  if (OrderSymbol()==Symbol() && OrderType()==OP_BUY)
                     {
                        ObjectDelete(TimeToStr(OrderOpenTime()));
                        ObjectDelete("Text"+OrderOpenTime());
                        iTwoPointsLine(TimeToStr(OrderOpenTime()),OrderOpenTime(),OrderOpenPrice(),Time[0],Bid,2,myLineColor);
                        iDrawSign("Text",iBarShift(OrderSymbol(),0,OrderOpenTime()),OrderOpenPrice(),myLineColor,0,DoubleToStr(OrderTicket(),0)+" buy",8);
                     }
                  if (OrderSymbol()==Symbol() && OrderType()==OP_SELL)
                     {
                        ObjectDelete(TimeToStr(OrderOpenTime()));
                        ObjectDelete("Text"+OrderOpenTime());
                        iTwoPointsLine(TimeToStr(OrderOpenTime()),OrderOpenTime(),OrderOpenPrice(),Time[0],Ask,3,myLineColor);
                        iDrawSign("Text",iBarShift(OrderSymbol(),0,OrderOpenTime()),OrderOpenPrice(),myLineColor,0,DoubleToStr(OrderTicket(),0)+" sell",8);
                     }
               }
         }
      if (myLots>myMaxLots)
         {
            iDisplayInfo("Waring", "持仓量已超过警戒线,请慎重下单!",0,4,110,12,"黑体",Olive);
         }
         else iDisplayInfo("Waring", "",0,4,110,12,"",Olive);
      return(0);
   }

/*
函    数:在屏幕上显示文字标签
输入参数:string LableName 标签名称,如果显示多个文本,名称不能相同
          string LableDoc 文本内容
          int Corner 文本显示角
          int LableX 标签X位置坐标
          int LableY 标签Y位置坐标
          int DocSize 文本字号
          string DocStyle 文本字体
          color DocColor 文本颜色
输出参数:在指定的位置(X,Y)按照指定的字号、字体及颜色显示指定的文本
算法说明:
*/
void iDisplayInfo(string LableName,string LableDoc,int Corner,int LableX,int LableY,int DocSize,string DocStyle,color DocColor)
   {
      if (Corner == -1) return(0);
      ObjectCreate(LableName, OBJ_LABEL, 0, 0, 0);
      ObjectSetText(LableName, LableDoc, DocSize, DocStyle,DocColor);
      ObjectSet(LableName, OBJPROP_CORNER, Corner);
      ObjectSet(LableName, OBJPROP_XDISTANCE, LableX);
      ObjectSet(LableName, OBJPROP_YDISTANCE, LableY);
   }
/*
函    数:两点间连线(主图)
输入参数:string myLineName  线段名称
          int myFirstTime  起点时间
          int myFirstPrice  起点价格
          int mySecondTime  终点时间
          int mySecondPrice  终点价格
          int myLineStyle  线型 0-实线 1-断线 2-点线 3-点划线 4-双点划线
          color myLineColor 线色
输出参数:在指定的两点间连线
算法说明:
*/
void iTwoPointsLine(string myLineName,int myFirstTime,double myFirstPrice,int mySecondTime,double mySecondPrice,int myLineStyle,color myLineColor)
   {
      ObjectCreate(myLineName,OBJ_TREND,0,myFirstTime,myFirstPrice,mySecondTime,mySecondPrice);//确定两点坐标
      ObjectSet(myLineName,OBJPROP_STYLE,myLineStyle); //线型
      ObjectSet(myLineName,OBJPROP_COLOR,myLineColor); //线色
      ObjectSet(myLineName,OBJPROP_WIDTH, 1); //线宽
      ObjectSet(myLineName,OBJPROP_BACK,false);
      ObjectSet(myLineName,OBJPROP_RAY,false);
   }
   
/*
函    数:标注符号和画线、文字
参数说明:string myType 标注类型:Dot画点、HLine画水平线、VLine画垂直线、myString显示文字
          int myBarPos 指定蜡烛坐标
          double myPrice 指定价格坐标
          color myColor 符号颜色
          int mySymbol 符号代码,108为圆点
          string myString 文字内容,在指定的蜡烛位置显示文字
函数返回:在指定的蜡烛和价格位置标注符号或者画水平线、垂直线
*/
void iDrawSign(string myType,int myBarPos,double myPrice,color myColor,int mySymbol,string myString,int myDocSize)
      {
         if (myType=="Text")
            {
               TextBarString=myType+Time[myBarPos];
               ObjectCreate(TextBarString,OBJ_TEXT,"",Time[myBarPos],myPrice);
               ObjectSet(TextBarString,OBJPROP_COLOR,myColor);//颜色
               ObjectSet(TextBarString,OBJPROP_FONTSIZE,myDocSize);//大小
               ObjectSetText(TextBarString,myString);//文字内容
               ObjectSet(TextBarString,OBJPROP_BACK,true);
            }
         if (myType=="Dot")
            {
               DotBarString=myType+Time[myBarPos];
               ObjectCreate(DotBarString,OBJ_ARROW,0,Time[myBarPos],myPrice);
               ObjectSet(DotBarString,OBJPROP_COLOR,myColor);
               ObjectSet(DotBarString,OBJPROP_ARROWCODE,mySymbol);
               ObjectSet(DotBarString,OBJPROP_BACK,false);
            }
         if (myType=="HLine")
            {
               HLineBarString=myType+Time[myBarPos];
               ObjectCreate(HLineBarString,OBJ_HLINE,0,Time[myBarPos],myPrice);
               ObjectSet(HLineBarString,OBJPROP_COLOR,myColor);
               ObjectSet(HLineBarString,OBJPROP_BACK,false);
            }
         if (myType=="VLine")
            {
               VLineBarString=myType+Time[myBarPos];
               ObjectCreate(VLineBarString,OBJ_VLINE,0,Time[myBarPos],myPrice);
               ObjectSet(VLineBarString,OBJPROP_COLOR,myColor);
               ObjectSet(VLineBarString,OBJPROP_BACK,false);
            }
     }

评分

参与人数 2金钱 +30 收起 理由
平衡 + 10 感谢分享
nasa1888 + 20 感谢分享

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享 分享淘帖 支持支持 保留保留

34

主题

4648

积分

2

精华

高级操盘手

金钱
4648 美元
权重
1
推荐
发表于 2017-1-10 11:10 | 只看该作者
删出一个单一功能,只显示持仓线,橙色为多单,蓝色为空单。

  1. #property indicator_chart_window
  2. int init()
  3.    {
  4.       return(0);
  5.    }

  6. int deinit()
  7.    {
  8.       ObjectDelete(TimeToStr(OrderOpenTime()));
  9.       return(0);
  10.    }
  11. int start()
  12.    {
  13.       iMain();
  14.       return(0);
  15.    }

  16. void iMain()
  17.    {
  18.       color myLineColor;
  19.       for (int cnt=0;cnt<OrdersTotal();cnt++)
  20.          {
  21.             if (OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
  22.                {
  23.                   //画持仓单线段,动态
  24.                   if (OrderType()==OP_SELL)  myLineColor=DeepSkyBlue;
  25.                   if (OrderType()==OP_BUY)  myLineColor=OrangeRed;
  26.                   if (OrderSymbol()==Symbol() && OrderType()==OP_BUY)
  27.                      {
  28.                         ObjectDelete(TimeToStr(OrderOpenTime()));
  29.                         iTwoPointsLine(TimeToStr(OrderOpenTime()),OrderOpenTime(),OrderOpenPrice(),Time[0],Bid,2,1,myLineColor);
  30.                      }
  31.                   if (OrderSymbol()==Symbol() && OrderType()==OP_SELL)
  32.                      {
  33.                         ObjectDelete(TimeToStr(OrderOpenTime()));
  34.                         iTwoPointsLine(TimeToStr(OrderOpenTime()),OrderOpenTime(),OrderOpenPrice(),Time[0],Ask,2,1,myLineColor);
  35.                      }
  36.                }
  37.          }

  38.       return(0);
  39.    }

  40. /*
  41. 函    数:两点间连线(主图)
  42. 输入参数:string myLineName  线段名称
  43.           int myFirstTime  起点时间
  44.           int myFirstPrice  起点价格
  45.           int mySecondTime  终点时间
  46.           int mySecondPrice  终点价格
  47.           int myLineStyle  线型 0-实线 1-断线 2-点线 3-点划线 4-双点划线
  48.           int myLineKuan 线宽
  49.           color myLineColor 线色
  50. 输出参数:在指定的两点间连线
  51. 算法说明:
  52. */
  53. void iTwoPointsLine(string myLineName,int myFirstTime,double myFirstPrice,int mySecondTime,double mySecondPrice,int myLineStyle,int myLineKuan,color myLineColor)
  54.    {
  55.       ObjectCreate(myLineName,OBJ_TREND,0,myFirstTime,myFirstPrice,mySecondTime,mySecondPrice);//确定两点坐标
  56.       ObjectSet(myLineName,OBJPROP_STYLE,myLineStyle); //线型
  57.       ObjectSet(myLineName,OBJPROP_COLOR,myLineColor); //线色
  58.       ObjectSet(myLineName,OBJPROP_WIDTH, myLineKuan); //线宽
  59.       ObjectSet(myLineName,OBJPROP_BACK,false);
  60.       ObjectSet(myLineName,OBJPROP_RAY,false);
  61.    }
复制代码
知道自己懂的太少了,才是知道的开始。
回复 支持 1 反对 0

使用道具 举报

34

主题

4648

积分

2

精华

高级操盘手

金钱
4648 美元
权重
1
推荐
发表于 2017-1-9 14:08 | 只看该作者
用代码格式好像行。RAR能上传。
回顾交易历史.rar (2.89 KB, 下载次数: 2)
  1. #property indicator_chart_window
  2. extern color TextColor=Red;
  3. int cnt;
  4. string TextBarString,DotBarString,HLineBarString,VLineBarString;

  5. int init()
  6.    {
  7.       return(0);
  8.    }

  9. int deinit()
  10.    {
  11.       Comment("");
  12.       ObjectsDeleteAll(0);
  13.       return(0);
  14.    }
  15. int start()
  16.    {
  17.       iMain();
  18.       return(0);
  19.    }

  20. void iMain()
  21.    {
  22.       //定义统计变量
  23.       int BuyHistoryOrders,SellHistoryOrders,ProfitHistoryOrders,HistoryOrderTotal;//买入历史订单、卖出历史订单、盈利历史订单、历史订单总数
  24.       int WinHistory,LossHistory; //历史盈利/亏损单累计
  25.       double TotalHistoryLots;//历史交易总手数
  26.       double TotalHistoryProfit,TotalHistoryLoss;//盈利总数、亏损总数变量
  27.       color myLineColor=Blue;
  28.      
  29.       iDisplayInfo("Times","动态报价时间:"+TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS)+" 星期"+DayOfWeek(),0,4,15,9,"Verdana",TextColor);
  30.       //遍历历史订单,计算相关信息
  31.       HistoryOrderTotal=OrdersHistoryTotal(); //统计历史订单总数
  32.       for (cnt=0;cnt<=HistoryOrderTotal-1;cnt++)
  33.          {
  34.             if (OrderSelect(cnt,SELECT_BY_POS,MODE_HISTORY))
  35.                {
  36.                   if (OrderType()==OP_BUY)
  37.                      {
  38.                         BuyHistoryOrders=BuyHistoryOrders+1;
  39.                         if (OrderProfit()>0)  myLineColor=Blue;
  40.                         if (OrderProfit()<0)  myLineColor=Red;
  41.                         if (OrderSymbol()==Symbol())
  42.                            {
  43.                               iTwoPointsLine(TimeToStr(OrderOpenTime()),OrderOpenTime(),OrderOpenPrice(),OrderCloseTime(),OrderClosePrice(),2,myLineColor);
  44.                               iDrawSign("Text",iBarShift(OrderSymbol(),0,OrderOpenTime()),OrderOpenPrice(),myLineColor,0,DoubleToStr(OrderTicket(),0)+" buy",8);
  45.                            }
  46.                      }
  47.                   if (OrderType()==OP_SELL)
  48.                      {
  49.                         SellHistoryOrders=SellHistoryOrders+1;
  50.                         if (OrderProfit()>0)  myLineColor=Blue;
  51.                         if (OrderProfit()<0)  myLineColor=Red;
  52.                         if (OrderSymbol()==Symbol())
  53.                            {
  54.                               iTwoPointsLine(TimeToStr(OrderOpenTime()),OrderOpenTime(),OrderOpenPrice(),OrderCloseTime(),OrderClosePrice(),3,myLineColor);
  55.                               iDrawSign("Text",iBarShift(OrderSymbol(),0,OrderOpenTime()),OrderOpenPrice(),myLineColor,0,DoubleToStr(OrderTicket(),0)+" sell",8);
  56.                            }
  57.                      }
  58.                   if (OrderProfit()>0)
  59.                      {
  60.                         WinHistory=WinHistory+1;
  61.                         TotalHistoryProfit=TotalHistoryProfit+OrderProfit();
  62.                      }
  63.                   if (OrderProfit()<0)
  64.                      {
  65.                         LossHistory=LossHistory+1;
  66.                         TotalHistoryLoss=TotalHistoryLoss+OrderProfit();
  67.                      }
  68.                   TotalHistoryLots=TotalHistoryLots+OrderLots();
  69.                }
  70.          }
  71.       iDisplayInfo("HistoryOrderTotal", "历史交易单总计:"+HistoryOrderTotal+"  (其中买入单:"+BuyHistoryOrders+"  卖出单:"+SellHistoryOrders+")",0,4,35,9,"",TextColor);
  72.       double myWinRate=(WinHistory*1.00)/(HistoryOrderTotal*1.00)*100; //胜率变量,int类型转double类型
  73.       iDisplayInfo("HistoryWinLoss", "历史盈利单总计:"+WinHistory+"  历史亏损单:"+LossHistory+"  胜率:"+DoubleToStr(myWinRate,2)+"%",0,4,50,9,"",TextColor);
  74.       iDisplayInfo("HistoryLots", "历史总下单量:"+DoubleToStr(TotalHistoryLots,2)+"手"+"  总盈利:"+DoubleToStr(TotalHistoryProfit,2)+"  总亏损:"+DoubleToStr(TotalHistoryLoss,2),0,4,65,9,"",TextColor);
  75.       double myOdds=(TotalHistoryProfit/WinHistory)/(-TotalHistoryLoss/LossHistory); //计算赔率=平均盈利/平均亏损
  76.       double myKelly=((myOdds+1)*(myWinRate/100)-1)/myOdds;
  77.       if (myKelly<0) myKelly=-myKelly;
  78.       double myMaxLots=AccountBalance()*myKelly/MarketInfo(Symbol(), MODE_MARGINREQUIRED);
  79.       iDisplayInfo("AverageRate", "平均盈利:"+DoubleToStr(TotalHistoryProfit/WinHistory,2)+"  平均亏损:"+DoubleToStr(TotalHistoryLoss/LossHistory,2),0,4,80,9,"",TextColor);
  80.       iDisplayInfo("Kelly", "赔率:"+DoubleToStr(myOdds,2)+"  凯利指标:"+DoubleToStr(myKelly*100,2)+"%"+
  81.                    "  持仓限制:"+DoubleToStr(myMaxLots,2)+"手",0,4,95,9,"",TextColor);
  82.       //持仓警告
  83.       double myLots;
  84.       for (cnt=0;cnt<OrdersTotal();cnt++)
  85.          {
  86.             if (OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
  87.                {
  88.                   myLots=myLots+OrderLots();
  89.                   //画持仓单线段,动态
  90.                   if (OrderProfit()>0)  myLineColor=Blue;
  91.                   if (OrderProfit()<0)  myLineColor=Red;
  92.                   if (OrderSymbol()==Symbol() && OrderType()==OP_BUY)
  93.                      {
  94.                         ObjectDelete(TimeToStr(OrderOpenTime()));
  95.                         ObjectDelete("Text"+OrderOpenTime());
  96.                         iTwoPointsLine(TimeToStr(OrderOpenTime()),OrderOpenTime(),OrderOpenPrice(),Time[0],Bid,2,myLineColor);
  97.                         iDrawSign("Text",iBarShift(OrderSymbol(),0,OrderOpenTime()),OrderOpenPrice(),myLineColor,0,DoubleToStr(OrderTicket(),0)+" buy",8);
  98.                      }
  99.                   if (OrderSymbol()==Symbol() && OrderType()==OP_SELL)
  100.                      {
  101.                         ObjectDelete(TimeToStr(OrderOpenTime()));
  102.                         ObjectDelete("Text"+OrderOpenTime());
  103.                         iTwoPointsLine(TimeToStr(OrderOpenTime()),OrderOpenTime(),OrderOpenPrice(),Time[0],Ask,3,myLineColor);
  104.                         iDrawSign("Text",iBarShift(OrderSymbol(),0,OrderOpenTime()),OrderOpenPrice(),myLineColor,0,DoubleToStr(OrderTicket(),0)+" sell",8);
  105.                      }
  106.                }
  107.          }
  108.       if (myLots>myMaxLots)
  109.          {
  110.             iDisplayInfo("Waring", "持仓量已超过警戒线,请慎重下单!",0,4,110,12,"黑体",Olive);
  111.          }
  112.          else iDisplayInfo("Waring", "",0,4,110,12,"",Olive);
  113.       return(0);
  114.    }

  115. /*
  116. 函    数:在屏幕上显示文字标签
  117. 输入参数:string LableName 标签名称,如果显示多个文本,名称不能相同
  118.           string LableDoc 文本内容
  119.           int Corner 文本显示角
  120.           int LableX 标签X位置坐标
  121.           int LableY 标签Y位置坐标
  122.           int DocSize 文本字号
  123.           string DocStyle 文本字体
  124.           color DocColor 文本颜色
  125. 输出参数:在指定的位置(X,Y)按照指定的字号、字体及颜色显示指定的文本
  126. 算法说明:
  127. */
  128. void iDisplayInfo(string LableName,string LableDoc,int Corner,int LableX,int LableY,int DocSize,string DocStyle,color DocColor)
  129.    {
  130.       if (Corner == -1) return(0);
  131.       ObjectCreate(LableName, OBJ_LABEL, 0, 0, 0);
  132.       ObjectSetText(LableName, LableDoc, DocSize, DocStyle,DocColor);
  133.       ObjectSet(LableName, OBJPROP_CORNER, Corner);
  134.       ObjectSet(LableName, OBJPROP_XDISTANCE, LableX);
  135.       ObjectSet(LableName, OBJPROP_YDISTANCE, LableY);
  136.    }
  137. /*
  138. 函    数:两点间连线(主图)
  139. 输入参数:string myLineName  线段名称
  140.           int myFirstTime  起点时间
  141.           int myFirstPrice  起点价格
  142.           int mySecondTime  终点时间
  143.           int mySecondPrice  终点价格
  144.           int myLineStyle  线型 0-实线 1-断线 2-点线 3-点划线 4-双点划线
  145.           color myLineColor 线色
  146. 输出参数:在指定的两点间连线
  147. 算法说明:
  148. */
  149. void iTwoPointsLine(string myLineName,int myFirstTime,double myFirstPrice,int mySecondTime,double mySecondPrice,int myLineStyle,color myLineColor)
  150.    {
  151.       ObjectCreate(myLineName,OBJ_TREND,0,myFirstTime,myFirstPrice,mySecondTime,mySecondPrice);//确定两点坐标
  152.       ObjectSet(myLineName,OBJPROP_STYLE,myLineStyle); //线型
  153.       ObjectSet(myLineName,OBJPROP_COLOR,myLineColor); //线色
  154.       ObjectSet(myLineName,OBJPROP_WIDTH, 1); //线宽
  155.       ObjectSet(myLineName,OBJPROP_BACK,false);
  156.       ObjectSet(myLineName,OBJPROP_RAY,false);
  157.    }
  158.    
  159. /*
  160. 函    数:标注符号和画线、文字
  161. 参数说明:string myType 标注类型:Dot画点、HLine画水平线、VLine画垂直线、myString显示文字
  162.           int myBarPos 指定蜡烛坐标
  163.           double myPrice 指定价格坐标
  164.           color myColor 符号颜色
  165.           int mySymbol 符号代码,108为圆点
  166.           string myString 文字内容,在指定的蜡烛位置显示文字
  167. 函数返回:在指定的蜡烛和价格位置标注符号或者画水平线、垂直线
  168. */
  169. void iDrawSign(string myType,int myBarPos,double myPrice,color myColor,int mySymbol,string myString,int myDocSize)
  170.       {
  171.          if (myType=="Text")
  172.             {
  173.                TextBarString=myType+Time[myBarPos];
  174.                ObjectCreate(TextBarString,OBJ_TEXT,"",Time[myBarPos],myPrice);
  175.                ObjectSet(TextBarString,OBJPROP_COLOR,myColor);//颜色
  176.                ObjectSet(TextBarString,OBJPROP_FONTSIZE,myDocSize);//大小
  177.                ObjectSetText(TextBarString,myString);//文字内容
  178.                ObjectSet(TextBarString,OBJPROP_BACK,true);
  179.             }
  180.          if (myType=="Dot")
  181.             {
  182.                DotBarString=myType+Time[myBarPos];
  183.                ObjectCreate(DotBarString,OBJ_ARROW,0,Time[myBarPos],myPrice);
  184.                ObjectSet(DotBarString,OBJPROP_COLOR,myColor);
  185.                ObjectSet(DotBarString,OBJPROP_ARROWCODE,mySymbol);
  186.                ObjectSet(DotBarString,OBJPROP_BACK,false);
  187.             }
  188.          if (myType=="HLine")
  189.             {
  190.                HLineBarString=myType+Time[myBarPos];
  191.                ObjectCreate(HLineBarString,OBJ_HLINE,0,Time[myBarPos],myPrice);
  192.                ObjectSet(HLineBarString,OBJPROP_COLOR,myColor);
  193.                ObjectSet(HLineBarString,OBJPROP_BACK,false);
  194.             }
  195.          if (myType=="VLine")
  196.             {
  197.                VLineBarString=myType+Time[myBarPos];
  198.                ObjectCreate(VLineBarString,OBJ_VLINE,0,Time[myBarPos],myPrice);
  199.                ObjectSet(VLineBarString,OBJPROP_COLOR,myColor);
  200.                ObjectSet(VLineBarString,OBJPROP_BACK,false);
  201.             }
  202.      }
复制代码
知道自己懂的太少了,才是知道的开始。
回复 支持 1 反对 0

使用道具 举报

8

主题

2314

积分

0

精华

中级操盘手

金钱
2314 美元
权重
0
地板
 楼主| 发表于 2017-1-9 13:55 | 只看该作者
我去 论坛怎么禁止上传mq4文件

2237

主题

1万

积分

8

精华

超级奶爸

责任编辑

金钱
18748 美元
权重
7
5
发表于 2017-1-9 14:04 | 只看该作者
馒头 发表于 2017-1-9 13:55
我去 论坛怎么禁止上传mq4文件

@admin 有么?
无人得以不朽而不去付出代价!

34

主题

4648

积分

2

精华

高级操盘手

金钱
4648 美元
权重
1
6
发表于 2017-1-9 14:13 | 只看该作者
挺好的指标,这个能把目前持有的单子也标注上,挺全的。
知道自己懂的太少了,才是知道的开始。

52

主题

1万

积分

4

精华

操盘专家

金钱
15549 美元
权重
22
7
发表于 2017-1-9 15:02 | 只看该作者
貌似高大上。谢谢。
新手,膇醺 $  的娇巭

52

主题

1万

积分

4

精华

操盘专家

金钱
15549 美元
权重
22
8
发表于 2017-1-9 15:17 | 只看该作者
没理解:
1、总盈利显示的,为什么是加上当前账户本金量?
2、凯利指标,显示的结果如何理解?
新手,膇醺 $  的娇巭

20

主题

2632

积分

1

精华

中级操盘手

金钱
2632 美元
权重
0
9
发表于 2017-1-9 15:29 | 只看该作者
很好的指标啊,有图吗?

8

主题

2314

积分

0

精华

中级操盘手

金钱
2314 美元
权重
0
10
 楼主| 发表于 2017-1-9 17:41 | 只看该作者
Plxmm66 发表于 2017-1-9 15:17
没理解:
1、总盈利显示的,为什么是加上当前账户本金量?
2、凯利指标,显示的结果如何理解?

1.MT4出入金也默认是个订单,原作者的统计方式不严谨,修改了下代码



#property indicator_chart_window
extern color TextColor=Red;
int cnt;
string TextBarString,DotBarString,HLineBarString,VLineBarString;

int init()
   {
      return(0);
   }

int deinit()
   {
      Comment("");
      ObjectsDeleteAll(0);
      return(0);
   }
int start()
   {
      iMain();
      return(0);
   }

void iMain()
   {
      //定义统计变量
      int BuyHistoryOrders,SellHistoryOrders,ProfitHistoryOrders,HistoryOrderTotal;//买入历史订单、卖出历史订单、盈利历史订单、历史订单总数
      int WinHistory,LossHistory; //历史盈利/亏损单累计
      double TotalHistoryLots;//历史交易总手数
      double TotalHistoryProfit,TotalHistoryLoss;//盈利总数、亏损总数变量
      color myLineColor=Blue;

      iDisplayInfo("Times","动态报价时间:"+TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS)+" 星期"+DayOfWeek(),0,4,15,9,"Verdana",TextColor);
      //遍历历史订单,计算相关信息
      HistoryOrderTotal=OrdersHistoryTotal(); //统计历史订单总数
      for (cnt=0;cnt<=HistoryOrderTotal-1;cnt++)
         {
            if (OrderSelect(cnt,SELECT_BY_POS,MODE_HISTORY))
               {
                  if (OrderType()==OP_BUY)
                     {
                        BuyHistoryOrders=BuyHistoryOrders+1;
                        if (OrderProfit()>0)  myLineColor=Blue;
                        if (OrderProfit()<0)  myLineColor=Red;
                        if (OrderSymbol()==Symbol())
                           {
                              iTwoPointsLine(TimeToStr(OrderOpenTime()),OrderOpenTime(),OrderOpenPrice(),OrderCloseTime(),OrderClosePrice(),2,myLineColor);
                              iDrawSign("Text",iBarShift(OrderSymbol(),0,OrderOpenTime()),OrderOpenPrice(),myLineColor,0,DoubleToStr(OrderTicket(),0)+" buy",8);
                           }
                  if (OrderProfit()>0)
                     {  
                        WinHistory=WinHistory+1;
                        TotalHistoryProfit=TotalHistoryProfit+OrderProfit();
                     }
                  if (OrderProfit()<0)
                     {
                        LossHistory=LossHistory+1;
                        TotalHistoryLoss=TotalHistoryLoss+OrderProfit();
                     }                           
                     }
                  if (OrderType()==OP_SELL)
                     {
                        SellHistoryOrders=SellHistoryOrders+1;
                        if (OrderProfit()>0)  myLineColor=Blue;
                        if (OrderProfit()<0)  myLineColor=Red;
                        if (OrderSymbol()==Symbol())
                           {
                              iTwoPointsLine(TimeToStr(OrderOpenTime()),OrderOpenTime(),OrderOpenPrice(),OrderCloseTime(),OrderClosePrice(),3,myLineColor);
                              iDrawSign("Text",iBarShift(OrderSymbol(),0,OrderOpenTime()),OrderOpenPrice(),myLineColor,0,DoubleToStr(OrderTicket(),0)+" sell",8);
                           }
                  if (OrderProfit()>0)
                     {  
                        WinHistory=WinHistory+1;
                        TotalHistoryProfit=TotalHistoryProfit+OrderProfit();
                     }
                  if (OrderProfit()<0)
                     {
                        LossHistory=LossHistory+1;
                        TotalHistoryLoss=TotalHistoryLoss+OrderProfit();
                     }
                     }
   /*                  
                  if (OrderProfit()>0)
                     {  
                        WinHistory=WinHistory+1;
                        TotalHistoryProfit=TotalHistoryProfit+OrderProfit();
                     }
                  if (OrderProfit()<0)
                     {
                        LossHistory=LossHistory+1;
                        TotalHistoryLoss=TotalHistoryLoss+OrderProfit();
                     } */
                  TotalHistoryLots=TotalHistoryLots+OrderLots();
               }
         }
      iDisplayInfo("HistoryOrderTotal", "历史交易单总计:"+HistoryOrderTotal+"  (其中买入单:"+BuyHistoryOrders+"  卖出单:"+SellHistoryOrders+")",0,4,35,9,"",TextColor);
      double myWinRate=(WinHistory*1.00)/(HistoryOrderTotal*1.00)*100; //胜率变量,int类型转double类型
      iDisplayInfo("HistoryWinLoss", "历史盈利单总计:"+WinHistory+"  历史亏损单:"+LossHistory+"  胜率:"+DoubleToStr(myWinRate,2)+"%",0,4,50,9,"",TextColor);
      iDisplayInfo("HistoryLots", "历史总下单量:"+DoubleToStr(TotalHistoryLots,2)+"手"+"  总盈利:"+DoubleToStr(TotalHistoryProfit,2)+"  总亏损:"+DoubleToStr(TotalHistoryLoss,2),0,4,65,9,"",TextColor);
      double myOdds=(TotalHistoryProfit/WinHistory)/(-TotalHistoryLoss/LossHistory); //计算赔率=平均盈利/平均亏损
      double myKelly=((myOdds+1)*(myWinRate/100)-1)/myOdds;
      if (myKelly<0) myKelly=-myKelly;
      double myMaxLots=AccountBalance()*myKelly/MarketInfo(Symbol(), MODE_MARGINREQUIRED);
      iDisplayInfo("AverageRate", "平均盈利:"+DoubleToStr(TotalHistoryProfit/WinHistory,2)+"  平均亏损:"+DoubleToStr(TotalHistoryLoss/LossHistory,2),0,4,80,9,"",TextColor);
      iDisplayInfo("Kelly", "赔率:"+DoubleToStr(myOdds,2)+"  凯利指标:"+DoubleToStr(myKelly*100,2)+"%",0,4,95,9,"",TextColor);  /*+
                  "  持仓限制:"+DoubleToStr(myMaxLots,2)+"手",0,4,95,9,"",TextColor);
      //持仓警告
      double myLots;
      for (cnt=0;cnt<OrdersTotal();cnt++)
         {
            if (OrderSelect(cnt,SELECT_BY_POS,MODE_TRADES))
               {
                  myLots=myLots+OrderLots();
                  //画持仓单线段,动态
                  if (OrderProfit()>0)  myLineColor=Blue;
                  if (OrderProfit()<0)  myLineColor=Red;
                  if (OrderSymbol()==Symbol() && OrderType()==OP_BUY)
                     {
                        ObjectDelete(TimeToStr(OrderOpenTime()));
                        ObjectDelete("Text"+OrderOpenTime());
                        iTwoPointsLine(TimeToStr(OrderOpenTime()),OrderOpenTime(),OrderOpenPrice(),Time[0],Bid,2,myLineColor);
                        iDrawSign("Text",iBarShift(OrderSymbol(),0,OrderOpenTime()),OrderOpenPrice(),myLineColor,0,DoubleToStr(OrderTicket(),0)+" buy",8);
                     }
                  if (OrderSymbol()==Symbol() && OrderType()==OP_SELL)
                     {
                        ObjectDelete(TimeToStr(OrderOpenTime()));
                        ObjectDelete("Text"+OrderOpenTime());
                        iTwoPointsLine(TimeToStr(OrderOpenTime()),OrderOpenTime(),OrderOpenPrice(),Time[0],Ask,3,myLineColor);
                        iDrawSign("Text",iBarShift(OrderSymbol(),0,OrderOpenTime()),OrderOpenPrice(),myLineColor,0,DoubleToStr(OrderTicket(),0)+" sell",8);
                     }
               }
         }
      if (myLots>myMaxLots)
         {
            iDisplayInfo("Waring", "持仓量已超过警戒线,请慎重下单!",0,4,110,12,"黑体",Olive);
         }
         else iDisplayInfo("Waring", "",0,4,110,12,"",Olive);*/
      return(0);
   }

/*
函    数:在屏幕上显示文字标签
输入参数:string LableName 标签名称,如果显示多个文本,名称不能相同
          string LableDoc 文本内容
          int Corner 文本显示角
          int LableX 标签X位置坐标
          int LableY 标签Y位置坐标
          int DocSize 文本字号
          string DocStyle 文本字体
          color DocColor 文本颜色
输出参数:在指定的位置(X,Y)按照指定的字号、字体及颜色显示指定的文本
算法说明:
*/
void iDisplayInfo(string LableName,string LableDoc,int Corner,int LableX,int LableY,int DocSize,string DocStyle,color DocColor)
   {
      if (Corner == -1) return(0);
      ObjectCreate(LableName, OBJ_LABEL, 0, 0, 0);
      ObjectSetText(LableName, LableDoc, DocSize, DocStyle,DocColor);
      ObjectSet(LableName, OBJPROP_CORNER, Corner);
      ObjectSet(LableName, OBJPROP_XDISTANCE, LableX);
      ObjectSet(LableName, OBJPROP_YDISTANCE, LableY);
   }
/*
函    数:两点间连线(主图)
输入参数:string myLineName  线段名称
          int myFirstTime  起点时间
          int myFirstPrice  起点价格
          int mySecondTime  终点时间
          int mySecondPrice  终点价格
          int myLineStyle  线型 0-实线 1-断线 2-点线 3-点划线 4-双点划线
          color myLineColor 线色
输出参数:在指定的两点间连线
算法说明:
*/
void iTwoPointsLine(string myLineName,int myFirstTime,double myFirstPrice,int mySecondTime,double mySecondPrice,int myLineStyle,color myLineColor)
   {
      ObjectCreate(myLineName,OBJ_TREND,0,myFirstTime,myFirstPrice,mySecondTime,mySecondPrice);//确定两点坐标
      ObjectSet(myLineName,OBJPROP_STYLE,myLineStyle); //线型
      ObjectSet(myLineName,OBJPROP_COLOR,myLineColor); //线色
      ObjectSet(myLineName,OBJPROP_WIDTH, 1); //线宽
      ObjectSet(myLineName,OBJPROP_BACK,false);
      ObjectSet(myLineName,OBJPROP_RAY,false);
   }
   
/*
函    数:标注符号和画线、文字
参数说明:string myType 标注类型:Dot画点、HLine画水平线、VLine画垂直线、myString显示文字
          int myBarPos 指定蜡烛坐标
          double myPrice 指定价格坐标
          color myColor 符号颜色
          int mySymbol 符号代码,108为圆点
          string myString 文字内容,在指定的蜡烛位置显示文字
函数返回:在指定的蜡烛和价格位置标注符号或者画水平线、垂直线
*/
void iDrawSign(string myType,int myBarPos,double myPrice,color myColor,int mySymbol,string myString,int myDocSize)
      {
         if (myType=="Text")
            {
               TextBarString=myType+Time[myBarPos];
               ObjectCreate(TextBarString,OBJ_TEXT,"",Time[myBarPos],myPrice);
               ObjectSet(TextBarString,OBJPROP_COLOR,myColor);//颜色
               ObjectSet(TextBarString,OBJPROP_FONTSIZE,myDocSize);//大小
               ObjectSetText(TextBarString,myString);//文字内容
               ObjectSet(TextBarString,OBJPROP_BACK,true);
            }
         if (myType=="Dot")
            {
               DotBarString=myType+Time[myBarPos];
               ObjectCreate(DotBarString,OBJ_ARROW,0,Time[myBarPos],myPrice);
               ObjectSet(DotBarString,OBJPROP_COLOR,myColor);
               ObjectSet(DotBarString,OBJPROP_ARROWCODE,mySymbol);
               ObjectSet(DotBarString,OBJPROP_BACK,false);
            }
         if (myType=="HLine")
            {
               HLineBarString=myType+Time[myBarPos];
               ObjectCreate(HLineBarString,OBJ_HLINE,0,Time[myBarPos],myPrice);
               ObjectSet(HLineBarString,OBJPROP_COLOR,myColor);
               ObjectSet(HLineBarString,OBJPROP_BACK,false);
            }
         if (myType=="VLine")
            {
               VLineBarString=myType+Time[myBarPos];
               ObjectCreate(VLineBarString,OBJ_VLINE,0,Time[myBarPos],myPrice);
               ObjectSet(VLineBarString,OBJPROP_COLOR,myColor);
               ObjectSet(VLineBarString,OBJPROP_BACK,false);
            }
     }



2.百分比显示的单笔止损额占本金的比例

评分

参与人数 1金钱 +20 收起 理由
admin + 20 感谢分享

查看全部评分

您需要登录后才可以回帖 登录 | 快捷注册(禁q号)

本版积分规则

QQ|黄金吧|黄金论坛|手机版|指标下载|非农|目录|交易危机

版权所有: ©2014-2021 fx3q.com Powered by Discuz! X3
皖ICP备: 2024050410号-2

风险提示:杠杆风险高,交易要谨慎 声明:坛友发言和回复均为个人观点,不代表论坛立场。
若有侵权请联系fx3q@qq.com删除

快速回复 返回顶部 返回列表