metatrade4索罗斯都要用到的外汇交易术

metatrade4索罗斯都要用到的外汇交易术

20160627
1.
#property strict
#property indicator_chart_window
#property indicator_buffers 2

double highBuffer[];
double lowBuffer[];

datetime StartHour=0;
int cnt,i,j;
int tempStartHour,tempEndHour;
int tempStartHourShift,tempEndHourShift;

int OnInit()
{
     IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));//根据市场报价形式显示数据
     SetIndexBuffer(0,highBuffer);
     SetIndexStyle(0,DRAW_LINE,STYLE_SOLID,2,Blue);
     SetIndexLabel(0,"区间高位");
     SetIndexBuffer(1,lowBuffer);
     SetIndexStyle(1,DRAW_LINE,STYLE_SOLID,2,Red);
     SetIndexLabel(1,"区间低位");
     return(INIT_SUCCEEDED);
}

//
void iHighLowInteral(int myBarShift)
{
     int myBarTime=iTime(NULL,0,myBarShift);//指定k线时间   ?datetime 
     int myStartHour=StrToTime(TimeYear(myBarTime)+"."+TimeMonth(myBarTime)+"."+TimeDay(myBarTime))+StartHour*60*60;//当前区间开始时间
     int myEndHour=myStartHour+24*60*60;
     if(tempStartHour!=myStartHour || tempEndHour!=myEndHour)
     {
         tempStartHour=myStartHour;
         tempEndHour=myEndHour;
         tempStartHourShift=iBarShift(NULL,0,tempStartHour);
         tempEndHourShift=iBarShift(NULL,0,tempEndHour);
         int tempBars=tempStartHourShift-tempEndHourShift;//区间k线数量
         int myHighBar=iHighest(NULL,0,MODE_HIGH,tempBars,tempEndHourShift);
         double myHighPrice=High[myHighBar];
         int myLowBar=iLowest(NULL,0,MODE_LOW,tempBars,tempEndHourShift);
         double myLowPrice=Low[myLowBar];
         //给指标赋值
         for(i=tempEndHourShift; i<=(tempEndHourShift+tempBars); i++)
         {
              highBuffer[i]=myHighPrice;
              lowBuffer[i]=myLowPrice;
         }
     }
}

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[])
{
     int counted_bars=prev_calculated;
     if(counted_bars<0)return(-1);
     //左边最后数的主子将被重新数
     if(counted_bars>0)counted_bars--;
     int limit=Bars-counted_bars;
     //
     for(int i=0;i
         iHighLowInteral(i);


     return(rates_total);
}


20160626
1.extern string PassWord="";//预定义密码变量
void OnTick()
{
     // 有效期限制
     if(TimeCurrent()>D'2016.7.12')
     {
         Comment("软件过期");
         return;
     }
     //密码认证
     if(PassWord!="Qd9fDe4cA")
     {
         Comment("密码不正确");
         return;
     }
}

2.
double iLotsFormat(double myLots)
{
     double minLot=MarketInfo(Symbol(),MODE_MINLOT);
     myLots=MathRound(myLots/minLot)*minLot; //四舍五入 整形化
     myLots=(myLots
     return(myLots);
}

3.
double iFundsToHands(string mySymbol,double myFunds)
{
     double myLots=myFunds/MarketInfo(mySymbol,MODE_MARGINREQUIRED);
     myLots=iLotsFormat(myLots);
     return(myLots);
}

4.
int iOrderProfitToPoint(int myTicket)
{
     int myPoint=0;
     if(OrderSelect(myTicket,SELECT_BY_POS,MODE_TRADES))
     {
         myPoint=NormalizeDouble(((OrderProfit()-OrderSwap())/MarketInfo(OrderSymbol(),MODE_TICKVALUE))/OrderLots(),0);
     }
     return(myPoint);
}
5.
double iLotsOptimized(double myFunds,double myCapitalRisk)
{
     double myMargin=myFunds*myCapitalRisk/100;//计算可用保证金额度
     double myLots=iLotsFormat(iFundsToHands(Symbol(),myMargin));//可开仓手数
     return(myLots);
}

6.
int iBarCode(int myBarShift)
{
     int result=0;
     double myOpen,myHigh,myLow,myClose;//开高低收
     myOpen=iOpen(NULL,0,myBarShift);
     myHigh=iHigh(NULL,0,myBarShift);
     myLow=iLow(NULL,0,myBarShift);
     myClose=iClose(NULL,0,myBarShift);
     if(myOpen
         result=1;//光头光脚阳线
     }else if(myOpen>myClose&&myOpen==myHigh&&myClose==myLow){
         result=-1;//光头光脚阴线
     }else if(myOpenmyLow&&myClose==myHigh){
         result=2;//下引线阳线
     }else if(myOpen>myClose&&myOpen==myHigh&&myClose>myLow){
         result=-2;//下引线阴线
     }else if(myOpen
         result=3;//上引线阳线
     }else if(myOpen>myClose&&myOpen
         result=-3;//上引线阴线
     }else if(myOpenmyLow&&myClose
         result=4;//上下引线阳线
     }else if(myOpen>myClose&&myOpenmyLow){
         result=-4;//上下引线阴线
     }else if(myOpen==myClose&&myOpen==myLow&&myClose
         result=5;//倒T字型
     }else if(myOpen==myClose&&myOpen==myHigh&&myClose
         result=-5;//T字型
     }else if(myOpen==myClose&&myOpen>myLow&&myClose
         result=6;//十字型
     }else if(myOpen==myClose&&myOpen==myHigh&&myClose==myLow){
         result=-6;//一字型
     }
     return(result);
}

20160625
1.//平仓和开仓如果一起运行 很容易出现奇怪的  需要用全部变量 p20
bool CloseAllBool=false; //预定义全平仓公共变量
void CommonpProcess(string 交易信号) / /通用流程
{
     if(BuyGroupOrders==0)
     {
         CloseAllBool=false; //如果持仓单为0,全平仓变量赋值false,允许建仓和新开仓
     }
     if(交易信号=="买入单平仓"&&BuyGroupOrders>0)
     {
         CloseAllBool=true;//持仓单大于0,且信号为平仓,全平仓变量赋为true
     }
     if(CloseAllBool==true)
     {
         //执行买入单平仓
         return(0);//不执行后面的代码
     }
     //以下代码为建仓,加仓流程 增加了全平仓变量判断
     if(BuyGroupOrders==0&&交易信号=="买入单建仓"&&CloseAllBool==false)
     {
         //执行买入单建仓
     }
     else if(BuyGroupOrders==1&&交易信号=="买入单建仓"&&CloseAllBool==false)
     {
         //执行买入单加仓
     }
}

20160624
1.
#property version     "1.00"
#property strict

//程序默认参数
extern string str="====默认系统参数====";
extern double preOpenLot=0.1;//预设开仓量
double Lots;
string orderComment="";//订单注释
string MyOrderComment;
int orderMagic=0;//订单特征码
int MyMagicNum;
//---------程控参数
int BuyGroupOrders,SellGroupOrders;//买入组,卖出组成交持仓单 数量统计
int BuyGroupFirstTicket,SellGroupFirstTicket; //买入组,卖出组第一单单号
int BuyGroupLastTicket,SellGroupLastTicket;//买入组,卖出组最后一单单号
int BuyGroupMaxProfitTicket,SellGroupMaxProfitTicket ;//买入组,卖出组最大盈利单单号
int BuyGroupMinProfitTicket,SellGroupMinProfitTicket ;//买入组,卖出组最小盈利单单号
int BuyGroupMaxLossTicket,SellGroupMaxLossTicket;//买入组,卖出组最大亏损单单号
int BuyGroupMinLossTicket,SellGroupMinLossTicket;//买入组,卖出组最小亏损单单号
int BuyGroupLots,SellGroupLots;//买入组,卖出组 成交持仓单开仓量总计
int BuyGroupProfit,SellGroupProfit;//买入组,卖出组成交单利润总计
int BuyLimitOrders,SellLimitOrders;//买入组,卖出组限价挂单数量
int BuyStopOrders,SellStopOrders;//买入组,卖出组突破挂单总计
//持仓单基本信息:0订单号,1开仓时间,2订单利润,3订单类型,4开仓量,5开仓价,6止损价,7止盈价,8订单特征码,9订单佣金,10掉期,11挂单有效日期
double OrdersArray[][12];//第1维:订单序号;第2维:订单基本信息     时间排序用
double myTempOrdersArray[][12];     //利润排序      存的buy sell单 而且是真实的数组个数大小
int MyArrayRange;//数组记录数量 ?
int cun,i,j,k;//计数器变量

int OnInit()
{
     //iShowInfo();
     //初始化参数
     Lots=preOpenLot;
     MyOrderComment="订单注释";
     MyMagicNum=20160626;
     return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
   {
   }
void OnTick()
{
     iMain();
}

void sortOrderArray()
{
     int myArrayCnt=0;
     int myArrayCnt1=0;
     //创建临时
     double myTempArray[][12];
     ArrayResize(myTempArray,MyArrayRange);//?
     ArrayInitialize(myTempArray,0.0);
     myArrayCnt=BuyGroupOrders+SellGroupOrders;//真正的有效数组个数
     myArrayCnt1=myArrayCnt-1; //最后一个
     ArrayResize(myTempOrdersArray,myArrayCnt);
     ArrayInitialize(myTempOrdersArray,0.0);
     for(i=0; i
     {
         if(OrdersArray[i][0]!=0)
         {
              if(OrdersArray[i][3]==OP_BUY||OrdersArray[i][3]==OP_SELL)
              {
                  for(k=0; k<=11; k++)
                       myTempOrdersArray[myArrayCnt1][k]=OrdersArray[i][k];
                  myArrayCnt1--;
              }
         }
     }
     //按时间降序排列数组
     //if(myOrderSort==0)
     {
         for(i=0; i
         {
              for(j=MyArrayRange-1; j>i; j--)
              {
                  if(OrdersArray[j][1]>OrdersArray[j-1][1]) //交换
                  {
                       for(k=0; k<=11; k++)
                           myTempArray[0][k]=OrdersArray[j-1][k];

                       for(k=0; k<=11; k++)
                           OrdersArray[j-1][k]=OrdersArray[j][k];

                       for(k=0; k<=11; k++)
                           OrdersArray[j][k]=myTempArray[0][k];
                  }
              }
         }
     }
     //if(myOrderSort==1 || myOrderSort==2) //按利润降序排列数组
     {
         for(i=0; i
         {
              for(j=myArrayCnt-1; j>i; j--)
              {
                  if(myTempOrdersArray[j][2]>myTempOrdersArray[j-1][2])
                  {
                       for(k=0; k<=11; k++)
                           myTempArray[0][k]=myTempOrdersArray[j-1][k];

                       for(k=0; k<=11; k++)
                           myTempOrdersArray[j-1][k]=myTempOrdersArray[j][k];

                       for(k=0; k<=11; k++)
                           myTempOrdersArray[j][k]=myTempArray[0][k];

                  }
              }
         }
     }
}

int iOrderSortTicket(int myOrderType,int myOrderSort,int myMaxMin)
{
     int myTicket=0;
     int myArrayCnt=BuyGroupOrders+SellGroupOrders;//真正的有效数组个数
     if(myArrayCnt==0)return(0);
     int myType;

     //X订单类型最小亏损单
     if(myOrderSort==2&&myMaxMin==1) //亏损 最小
     {
         for(i=0; i
         {
              myType=NormalizeDouble(myTempOrdersArray[i][3],0);
              if(myTempOrdersArray[i][2]<0&&myType==myOrderType)
              {
                  myTicket=NormalizeDouble(myTempOrdersArray[i][0],0);
                  break;
              }
         }
     }
     else if(myOrderSort==2&&myMaxMin==0)//亏损 最大
     {
         for(i=myArrayCnt-1 ;i>=0; i--)
         {
              myType=NormalizeDouble(myTempOrdersArray[i][3],0);
               if(myTempOrdersArray[i][2]<0&&myType==myOrderType)
              {
                  myTicket=NormalizeDouble(myTempOrdersArray[i][0],0);
                  break;
              }
         }
     }
     else if(myOrderSort==1&&myMaxMin==0)//盈利 最小
     {
         for(i=myArrayCnt-1; i>=0; i--)
         {
              myType=NormalizeDouble(myTempOrdersArray[i][3],0);
               if(myTempOrdersArray[i][2]>0&&myType==myOrderType)
              {
                  myTicket=NormalizeDouble(myTempOrdersArray[i][0],0);
                  break;
              }
         }
     }
     else if(myOrderSort==1&&myMaxMin==0) //盈利 最大
     {
         for(i=0; i
         {
              myType=NormalizeDouble(myTempOrdersArray[i][3],0);
              if(myTempOrdersArray[i][2]>0&&myType==myOrderType)
              {
                  myTicket=NormalizeDouble(myTempOrdersArray[i][0],0);
                  break;
              }
         }
     }
     else if(myOrderSort==0&&myMaxMin==1) //时间 最小   第一开仓单
     {
         for(i=myArrayCnt-1; i>=0; i--)
         {
              myType=NormalizeDouble(myTempOrdersArray[i][3],0);
              if(OrdersArray[i][0]!=0 && myType==myOrderType)
              {
                  myTicket=NormalizeDouble(OrdersArray[i][0],0);
                  break;
              }
         }
     }
     else if(myOrderSort==0&&myMaxMin==0) //时间 最大   最后开仓单 最新开仓单
     {
         for(i=0; i
         {
              myType=NormalizeDouble(myTempOrdersArray[i][3],0);
              if(OrdersArray[i][0]!=0 && myType==myOrderType)
              {
                  myTicket=NormalizeDouble(OrdersArray[i][0],0);
                  break;
              }
         }
     }
     return(myTicket);
}

void iShowInfo()
{
     //设置初始值
     BuyGroupOrders=SellGroupOrders=0;
     BuyGroupFirstTicket=SellGroupFirstTicket=0;
     BuyGroupLastTicket=SellGroupLastTicket=0;
     BuyGroupMaxProfitTicket=SellGroupMaxProfitTicket =0;
     BuyGroupMinProfitTicket=SellGroupMinProfitTicket =0;
     BuyGroupMaxLossTicket=SellGroupMaxLossTicket=0;
     BuyGroupMinLossTicket=SellGroupMinLossTicket=0;
     BuyGroupLots=SellGroupLots=0;
     BuyGroupProfit=SellGroupProfit=0;
     BuyLimitOrders=SellLimitOrders=0;
     BuyStopOrders=SellStopOrders=0;
     //初始化订单数组
     MyArrayRange=OrdersTotal();//?和书不一样
     ArrayResize(OrdersArray,MyArrayRange);//重新设定数组个数
     ArrayInitialize(OrdersArray,0.0);//初始化
     if(OrdersTotal()>0)
     {
         for(i=0; i
         {
              if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)&&OrderSymbol()==Symbol()&&OrderMagicNumber()==MyMagicNum)
              {
                  OrdersArray[i][0]=OrderTicket();
                  OrdersArray[i][1]=OrderOpenTime();
                  OrdersArray[i][2]=OrderProfit();
                  OrdersArray[i][3]=OrderType();
                  OrdersArray[i][4]=OrderLots();
                  OrdersArray[i][5]=OrderOpenPrice();
                  OrdersArray[i][6]=OrderStopLoss();
                  OrdersArray[i][7]=OrderTakeProfit();
                  OrdersArray[i][8]=OrderMagicNumber();
                  OrdersArray[i][9]=OrderCommission();
                  OrdersArray[i][10]=OrderSwap();
                  OrdersArray[i][11]=OrderExpiration();
              }
         }
         //统计基本信息
         for(i=0; i
         {
              if(OrdersArray[i][0]!=0) //有订单
              {
                  if(OrdersArray[i][3]==OP_BUY) //买入持仓单
                  {
                       BuyGroupOrders++;
                       BuyGroupLots+=OrdersArray[i][4];
                       BuyGroupProfit+=OrdersArray[i][2];
                  } 
                  else if(OrdersArray[i][3]==OP_SELL)//卖出持仓单
                  {
                       SellGroupOrders++;
                       SellGroupLots+=OrdersArray[i][4];
                       SellGroupProfit+=OrdersArray[i][2];
                  }
                  else if(OrdersArray[i][3]==OP_BUYLIMIT)//买入 限价
                  {
                       BuyLimitOrders++;
                  }
                  else if(OrdersArray[i][3]==OP_SELLLIMIT)//卖出 限价
                  {
                       SellLimitOrders++;
                  }
                  else if(OrdersArray[i][3]==OP_BUYSTOP)//买入 突破
                  {
                       BuyStopOrders++;
                  }
                  else if(OrdersArray[i][3]==OP_SELLSTOP)//卖出 突破
                  {
                       SellStopOrders++;
                  }
              }
         }
         //计算买入卖出组首尾等信息
         sortOrderArray();//先排序下面在取值(提高效率)
         BuyGroupFirstTicket=iOrderSortTicket(OP_BUY,0,1);
         SellGroupFirstTicket=iOrderSortTicket(OP_SELL,0,1);
         BuyGroupLastTicket=iOrderSortTicket(OP_BUY,0,0);
         SellGroupLastTicket=iOrderSortTicket(OP_SELL,0,0);
         BuyGroupMinProfitTicket=iOrderSortTicket(OP_BUY,1,1);
         SellGroupMinProfitTicket =iOrderSortTicket(OP_SELL,1,1);
         BuyGroupMaxProfitTicket=iOrderSortTicket(OP_BUY,1,0);
         SellGroupMaxProfitTicket =iOrderSortTicket(OP_SELL,1,0);
         BuyGroupMaxLossTicket=iOrderSortTicket(OP_BUY,2,0);
         SellGroupMaxLossTicket=iOrderSortTicket(OP_SELL,2,0);
         BuyGroupMinLossTicket=iOrderSortTicket(OP_BUY,2,1);
         SellGroupMinLossTicket=iOrderSortTicket(OP_SELL,2,1);
     }
}

void iMain()
{
     iShowInfo() ;
}

20160623
1./ *变色的指标
*/
#property strict
#property indicator_chart_window
#property indicator_buffers 2

extern int MA_Period=20;
double UpLineBuffer[],DownLineBuffer[];
int ExtCountedBars=0;

int OnInit()
   {
     IndicatorDigits(MarketInfo(Symbol(),MODE_DIGITS));//根据市场报价形式显示数据
     int i=0;
     SetIndexBuffer(i,UpLineBuffer);
     SetIndexStyle(i,DRAW_LINE,STYLE_SOLID,2,Red);
     SetIndexLabel(i,"上线("+MA_Period+")");
     i=1;
     SetIndexBuffer(i,DownLineBuffer);
     SetIndexStyle(i,DRAW_LINE,STYLE_SOLID,2,Blue);
     SetIndexLabel(i,"下线("+MA_Period+")");
     return(INIT_SUCCEEDED);
   }
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[])
   {
     int counted_bars=prev_calculated;
     if(counted_bars<0)return(-1);
     //左边最后数的主子将被重新数
     if(counted_bars>0)counted_bars--;
     int limit=Bars-counted_bars;
     //
     for(int i=0;i
     {
         double sum=0;
         for(int j=0;j
              sum+=Close[i+j];
         double ma=sum/MA_Period;
         if(Close[i]>ma) DownLineBuffer[i]=ma;
         else UpLineBuffer[i]=ma;
     }

     return(rates_total);
   }

2.
#property version     "1.00"
#property strict

//新建/重写文件
bool WriteFile(string docName)
{
     bool result;
     string myDocName=docName+".csv";
     int handle=FileOpen(myDocName,FILE_CSV|FILE_READ|FILE_WRITE,',');
     if(handle<1)
     {
         result=false;
         Comment("写入文件失败");
     }
     else if(handle>0)
     {
         result=true;
         FileWrite(handle,"序号","开盘价","收盘价","最高价","最低价","成交量","成交量","日期");
         for(int i=1;i<=100;i++)
         {
              FileWrite(handle,i,Open[i],Close[i],High[i],Low[i],Volume[i],TimeToStr(Time[i]));
         }
         FileClose(handle);
         handle=0;
     }
     return(result);
}
//读取文件     显示指定记录
bool ReadFile(string docName,int i)
{
     bool result;
     string myDocName=docName+".csv";
     int handle=FileOpen(myDocName,FILE_CSV|FILE_READ,';');
     if(handle<1)
     {
         result=false;
         Comment("读取文件失败");
     }
     else if(handle>0)
     {
         int myPos=0; //文件指针变量
         int num=0;//记录总数
         result=true;//读取文件成功
         while(!FileIsEnding(handle))
         {
              FileSeek(handle,myPos,SEEK_SET);//指针点位到开始位置
              string myRecord=FileReadString(handle);//读入一条记录
              if(num==i) Comment("第"+i+"条记录:"+myRecord);

              if(FileIsEnding(handle)) break; //文件结束 退出循环
              myPos=FileTell(handle);//当前指针位置
              num++;    
         }
         Print("指针总数:"+myPos+" 总记录数"+num);//2016.06.23 21:50:19.042      CSV文件操作 GBPUSD,H1: 指针总数:5738 总记录数100
         FileClose(handle);//关闭文件
         handle=0;
     }
     return(result);
}

void iWait()
{
     while(!IsTradeAllowed() || IsTradeContextBusy())Sleep(100);
     RefreshRates();
}
3.为什么EA开仓会报错
a,即时交易中开仓价位,开仓量有问题
b,有些平台不允许开仓时设置止盈止损
c,止盈止损价格不符合StopLevel规则
d,挂单交易中价格设置不当。

20160622
1.// 如何控制在一个k线中只做一次交易动作
int lastTime=0; //k线时间变量
void OnTick()
{
     if(lastTime==Time[0])return; //判断是否是当前k线
     //doSomething
     lastTime=Time[0];//更新时间
}
2.// 计算适合报价平台的价格并返回  入参为买入或卖出报价
double ND(double price)
{
     return (NormalizeDouble(price,Digits));
}

20160621
1.MM平台 有对赌平台的成功,尤其是无监管的黑平台
ECN平台 好, 通常不允许开仓时设置止盈止损。
OrderSelect   不论持仓单还是历史订单, 订单最远的那张需要为0,最近的那张序号是订单总数-1

2.
#property strict
#property indicator_chart_window
#property   indicator_buffers 1
double CrossBuffer[];
int OnInit()
   {
     int i=0;
     SetIndexStyle(i,DRAW_SECTION,STYLE_SOLID,1,Red);
     SetIndexBuffer(i,CrossBuffer);
     SetIndexLabel(i,"十字星价位");
     ArrayInitialize(CrossBuffer,0.0);
     return(INIT_SUCCEEDED);
   }
int deinit()
{
     ObjectsDeleteAll();
     return(0);
}
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[])
   {
   int counted_bars=prev_calculated;
   if(counted_bars<0)return(-1);
   //左边最后数的主子将被重新数
   if(counted_bars>0)counted_bars--;
   int limit=Bars-counted_bars;
   //最新这根不处理
   for(int i=1;i
   {
      if(Close[i]==Open[i])CrossBuffer[i]=Close[i];
   }

   return(rates_total);
  }
3。
#property strict
void OnStart()
   {
     if(OrdersTotal()==0)
     {
         Comment("没有持仓单");
         return;
     }
     string currentSymbol=Symbol();
     for(int i=OrdersTotal()-1;i>=0;i--)
     {
         if(OrderSelect(i,SELECT_BY_POS)==false)continue;
         else
         {
              if(OrderSymbol()==currentSymbol)
              {
                  if(OrderClose(OrderTicket(),OrderLots(),Close[0],0)==true)
                       Comment("订单"+DoubleToStr(OrderTicket(),0)+"已按照"+DoubleToStr(Close[0],Point)+"价格平仓");
              }
         }
     }
   }


20160620
1. 显示市场信息脚本
#property copyright "Copyright 2016, MetaQuotes Software Corp."
#property link         "https://www.mql5.com"
#property version     "1.00"
#property strict
void OnStart()
{
     string lableDoc="===================="+"\n"+
         "交易商:"+TerminalCompany()+
         "交易平台:"+TerminalName()+
         "服务器名称:"+AccountServer()+"\n"+
         "开户公司:"+AccountCompany()+
         "账号:"+AccountNumber()+
         "账户名称:"+AccountName()+
         "交易货币:"+AccountCurrency()+
         "杠杆:1:"+AccountLeverage()+"\n"+
         "===================="+"\n"+
         "当前品种:"+Symbol()+
         "当前点差:"+DoubleToStr(MarketInfo(Symbol(),MODE_SPREAD),0)+
         "停止水平点:"+DoubleToStr(MarketInfo(Symbol(),MODE_STOPLEVEL),0)+"\n"+
         "报价小数位数:"+Digits+
         "最小报价单位:"+DoubleToStr(Point,Digits)+"\n"+
         "1标准手价值:"+DoubleToStr(MarketInfo(Symbol(),MODE_LOTSIZE),0)+
         "1个点价值:"+DoubleToStr(MarketInfo(Symbol(),MODE_TICKVALUE),4)+
         "1个点报价:"+DoubleToStr(MarketInfo(Symbol(),MODE_TICKSIZE),Digits)+"\n"+
         "最小开仓手数:"+DoubleToStr(MarketInfo(Symbol(),MODE_MINLOT),Digits)+
         "最大允许标准手数:"+DoubleToStr(MarketInfo(Symbol(),MODE_MAXLOT),0)+
         "开仓量最小递增量:"+DoubleToStr(MarketInfo(Symbol(),MODE_LOTSTEP),Digits)+"\n"+
         "1标准手的护盘保证金:"+DoubleToStr(MarketInfo(Symbol(),MODE_MARGINHEDGED),2)+
         "1标准手的初始保证金:"+DoubleToStr(MarketInfo(Symbol(),MODE_MARGININIT),2)+"\n"+
         "冻结订单水平点:"+DoubleToStr(MarketInfo(Symbol(),MODE_FREEZELEVEL),2)+
         "账户信用点数:"+DoubleToStr(AccountCredit(),2)+"\n"+
         "===================="+"\n"+
         "账户余额:"+DoubleToStr(AccountBalance(),2)+
         "账户净值:"+DoubleToStr(AccountEquity(),2)+
         "已用保证金:"+DoubleToStr(AccountMargin(),2)+
         "账户利润:"+DoubleToStr(AccountProfit(),2)+"\n"+
         "1标准手保证金:"+DoubleToStr(MarketInfo(Symbol(),MODE_MARGINREQUIRED),2)+
         "当前可用保证金:"+DoubleToStr(AccountFreeMargin(),2)+
         "停止水平值:"+AccountStopoutLevel()+"\n"+
         "当前价格买入1手保证金:"+DoubleToStr(AccountFreeMarginCheck(Symbol(),OP_BUY,1.0),2)+
         "当前价格卖出1手保证金:"+DoubleToStr(AccountFreeMarginCheck(Symbol(),OP_SELL,1.0),2)+
         "买入持仓单隔夜利息:"+DoubleToStr(MarketInfo(Symbol(),MODE_SWAPLONG),2)+
         "卖出持仓单隔夜利息:"+DoubleToStr(MarketInfo(Symbol(),MODE_SWAPSHORT),2)+"\n"+
         "====================";
     Comment(lableDoc);
}

20160619
1.函数默认参数
void somefunc(double first,double sec=0.0001,int level=10);
//正常调用
     somefunc(3.14);
     somefunc(3.14,0.0002); 

2.指标-交易历史图形
#property copyright "MT4"
#property link         ""
#property version     "1.00"
#property strict

#include

//指标在主图上显示
#property indicator_chart_window
#property indicator_buffers 3
//定义买入订单开盘箭头 卖出订单开盘箭头,平仓符号
double OpenBuyArrow[],OpenSellArrow[],CloseArrow[];

int OnInit()
{
     //设置开仓买入订单箭头模型
     int i=0;
     SetIndexStyle(i,DRAW_ARROW,EMPTY,1,Green);
     SetIndexArrow(i,221);
     SetIndexBuffer(i,OpenBuyArrow);
     SetIndexLabel(i,"买入订单开仓价");
     //设置开仓卖出订单箭头模型
     i=1;
     SetIndexStyle(i,DRAW_ARROW,EMPTY,1,Red);
     SetIndexArrow(i,222);
     SetIndexBuffer(i,OpenSellArrow);
     SetIndexLabel(i,"卖出订单开仓价");
     //平仓
     i=2;
     SetIndexStyle(i,DRAW_ARROW,EMPTY,1,DarkOrange);
     SetIndexArrow(i,251);
     SetIndexBuffer(i,CloseArrow);
     SetIndexLabel(i,"平仓价");
     return(INIT_SUCCEEDED);
}
int deinit()
{
     ObjectsDeleteAll(0); //删除主图上的对象
     return (0);
}

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[])
{
     ObjectsDeleteAll(0);
     //定义统计变量
     int BuyOrders,SellOrders,ProfitOrders;//买入订单,卖出订单,盈利订单数量
     double TotalTradeLots;//交易总手
     double TotalProfit,TotalLoss;
     iSetLabel("标题栏","老王作品",200,1,8,"黑体",Red);
     string lableDoc="动态报价时间:"+TimeToStr(TimeCurrent(),TIME_DATE|TIME_SECONDS)+" 星期"+DayOfWeek();
     iSetLabel("时间栏",lableDoc,4,15,9,"Verdana",Red);
     //画历史订单
     int hstTotal=OrdersHistoryTotal();//获得历史订单总数   应该只有OP_BUY OP_SELL 这两种类型
     for(int i=0;i
     {
         OrderSelect(i,SELECT_BY_POS,MODE_HISTORY);
         int openBar=iBarShift(Symbol(),0,OrderOpenTime());
         int closeBar=iBarShift(Symbol(),0,OrderCloseTime());
         if(OrderType()==OP_BUY)//多单
         {
              OpenBuyArrow[openBar]=OrderOpenPrice();
              BuyOrders++;
              //计算盈亏
              if(OrderProfit()>0)
              {
                  TotalProfit+=OrderProfit();
                  ProfitOrders++;
              }
              if(OrderProfit()<0) TotalLoss+=OrderProfit();
         }
         if(OrderType()==OP_SELL)//空单
         {
              OpenSellArrow[openBar]=OrderOpenPrice();
              SellOrders++;
              //计算盈亏
              if(OrderProfit()>0)
              {
                  TotalProfit+=OrderProfit();
                  ProfitOrders++;
              }
              if(OrderProfit()<0) TotalLoss+=OrderProfit();
         }
         //交易总手数
         TotalTradeLots+=OrderLots();
         //平仓符号
         CloseArrow[closeBar]=OrderCloseTime();
         SetObj(OrderTicket(),OrderType(),OrderOpenTime(),OrderOpenPrice(),OrderCloseTime(),OrderClosePrice());
     }
     //画持仓订单,动态显示开仓单与当前价的连线
     int total=OrdersTotal();
     for(int i=0;i
     {
         OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
         if(OrderType()<=1)//只处理持仓单
         {
              //删除旧连线对象
              string objectName="订单号-"+DoubleToStr(OrderTicket(),0);
              ObjectDelete(objectName);
              int openBar=iBarShift(Symbol(),0,OrderOpenTime());
              int closeBar=iBarShift(Symbol(),0,OrderCloseTime());
              if(OrderType()==OP_BUY)
              {
                  OpenBuyArrow[openBar]=OrderOpenPrice();
              }
              if(OrderType()==OP_SELL)
              {
                  OpenSellArrow[openBar]=OrderOpenPrice();
              }
              SetObj(OrderTicket(),OrderType(),OrderOpenTime(),OrderOpenPrice(),Time[0],Close[0]);
         }

         //显示统计信息
         lableDoc="历史交易单总计:"+hstTotal+" (买入订单:"+BuyOrders+" 卖出订单:"+SellOrders+")";
         iSetLabel("交易单统计",lableDoc,4,35,9,"Verdana",Gray);
         lableDoc="盈利订单百分比:"+DoubleToStr((ProfitOrders*0.01)/(hstTotal*0.01)*100,2)+"%";
         iSetLabel("胜率",lableDoc,4,50,9,"Verdana",Gray);
         lableDoc="净盈利:"+DoubleToStr((TotalProfit+TotalLoss),2)+" (总获利:"+DoubleToStr(TotalProfit,2)+" 总亏损:"+DoubleToStr(TotalLoss,2)+")";
         iSetLabel("盈亏统计",lableDoc,4,65,9,"Verdana",Gray);
         lableDoc="账户余额:"+DoubleToStr(AccountBalance(),2)+" 账户净值:"+DoubleToStr(AccountEquity(),2);
         iSetLabel("账户余额",lableDoc,4,80,9,"Verdana",Gray);
         lableDoc="总下单量(手):"+DoubleToStr(TotalTradeLots,2);
         iSetLabel("下单量",lableDoc,4,95,9,"Verdana",Gray);
     }
     return(rates_total);
}

20160618
1. MACD与补仓3 主要学习代码逻辑用的
#include
extern double Init_Lots=0.01;
extern double Profit_Rate=34;
extern double Max_Bet_Lots=0.4;
extern double LostRate=2;

int Order_Total=50;
int Bet_Order=50;
bool LotsDouble=true;
int iBet_Order=0;//加倍订单计数器变量
double perProfit=0;//每批订单总盈亏变量
double iLots;//追加订单开仓量变量     //? 是不是用static 会好一点
double Init_Balance;//账户初始资金变量
double xMax_Bet_Lots;//最大浮动开仓量变量
int TicketNo;

int OnInit()
{
     iLots=Init_Lots;
     xMax_Bet_Lots=Max_Bet_Lots;
     Init_Balance=AccountBalance();
     return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason)
{
}

string ReturnMarketInformation()
{
     string result="N/A";
     double macd0=iMACD(NULL,0,10,60,1,PRICE_CLOSE,MODE_SIGNAL,0);
     double macd2=iMACD(NULL,0,10,60,1,PRICE_CLOSE,MODE_SIGNAL,10);
     double price0=Close[0];
     double high2=High[2];
     double low2=Low[2];
     if(macd0>(macd2+0.00003)&&price0>high2)result="Sell";
     if(macd0<(macd2-0.00003)&&price0
     return result;
}

//计算账户余额,返回最新开仓量
double NewLots()
{
     //计算翻倍倍数
     double xRate=((AccountBalance()-Init_Balance)/Init_Balance)/(Profit_Rate/100);//? 取倍数的整数部分
     //计算开仓手数
     double xLots=NormalizeDouble(Init_Lots*xRate,2);
     if(xLots<0.01) xLots=0.01;
     //如果翻倍倍数大于1,才计算最大浮动开仓量变量
     if(xRate>1)xMax_Bet_Lots=Max_Bet_Lots*xRate;
     return xLots;
}
//根据市场信息开新仓
void OpenNewOrder(double myLots)
{
     string MktInfo=ReturnMarketInformation();
     if(MktInfo=="Buy" || MktInfo=="Sell")
     {
         TicketNo=iOpenOrders(MktInfo,myLots,0,0);
         Draw_Mark(TicketNo);
     }
}
void OnTick()
{
     //提取市场信号
     string mktSignal=ReturnMarketInformation();

     //显示市场信息
   string labelDoc="星期"+DayOfWeek()+"市场时间: "+Year()+"-"+Month()+"-"+Day()+" "+Hour()+":"+Seconds();
   iSetLabel("时间栏",labelDoc,200,0,9,"Verdana",Red);
   labelDoc="市场信号:"+mktSignal+" 最大开仓量:"+DoubleToStr(xMax_Bet_Lots,2);
   iSetLabel("信息栏",labelDoc,5,60,10,"Verdana",Blue);
   labelDoc="初始余额:"+DoubleToStr(Init_Balance,2)+" 当前余额:"+DoubleToStr(AccountBalance(),2);
   iSetLabel("信息栏1",labelDoc,5,20,10,"Verdana",Blue);
   labelDoc="最低开仓量:"+DoubleToStr(NewLots(),2)+" 浮动开仓量:"+DoubleToStr(iLots,2);
   iSetLabel("信息栏2",labelDoc,5,40,10,"Verdana",Blue);

   //新开仓
   if(OrdersTotal()==0)
   {
   //如果前一单亏损,则亏损加倍
     if(perProfit<0&& LotsDouble==true)iLots=iLots*LostRate;
     if(iLots>xMax_Bet_Lots)iLots=xMax_Bet_Lots;
     OpenNewOrder(iLots);
     perProfit=0;//前一批订单盈利清零
   }

   //处理已有持仓单
   if(OrdersTotal()>1)
   {
     //选定当前订单
     OrderSelect(OrdersTotal()-1,SELECT_BY_POS);
     //新订单不足一个周期,不做任何操作
     if((TimeCurrent()-OrderOpenTime())<=Period()*60) return;

     //追加盈利订单
     double iiLots=iLots;
     //如果超过加倍订单数量,交易量恢复初始值
     if(iBet_Order>=Bet_Order) iiLots=NewLots();
     //追加买入订单
     if(OrderType()==OP_BUY&&mktSignal=="Buy"&&OrdersTotal()<=Order_Total&&Ask>OrderOpenPrice())
     {
         TicketNo=iOpenOrders(mktSignal,iiLots,0,0);
         Draw_Mark(TicketNo);
         iBet_Order++; //加倍订单计数
     }
     //追加卖出订单
     if(OrderType()==OP_SELL&&mktSignal=="Sell"&&OrdersTotal()<=Order_Total&&Bid
     {
         TicketNo=iOpenOrders(mktSignal,iiLots,0,0);
         Draw_Mark(TicketNo);
         iBet_Order++; //加倍订单计数
     }

     //止损平仓 如果出现反向信号,平掉所有订单
     if((OrderType()==OP_BUY&&mktSignal=="Sell") ||(OrderType()==OP_SELL&&mktSignal=="Buy"))
     {
      for(int i=OrdersTotal()-1;i>=0;i--) //? 和书不一样
      {
         if(OrderSelect(i,SELECT_BY_POS)==false)continue;
         else
         {
              OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0);
              perProfit+=OrderProfit();//利润累加
         }
      }
      //盈利后,重新计算开仓量
      if(perProfit>0)iLots=NewLots();
      iBet_Order=0; //加倍订单变量清零
     }
   }
   return;
}

20160617
1, 鳄鱼三线3.5EA   测试不开单
#include
extern int StopLoss=40;
extern int TakeProfit=0;
extern double MaxRisk=30;//资金风险1=1%
extern double Filter=0.35;//Force指标过滤参数
double Alligator_jaw,Alligator_teeth,Alligator_lips,Envelops21_upper,Envelops21_lower,Force3;
string objectSymbol="EURUSD";
int timeFrame=PERIOD_M30;
int OnInit()
   {
     return(INIT_SUCCEEDED);
   }
void OnDeinit(const int reason)
   {
   }

string ReturnMarketInformation()
{
     string result="N/A";
     Alligator_jaw=NormalizeDouble((iAlligator(objectSymbol,timeFrame,8,0,5,0,3,0,MODE_EMA,PRICE_WEIGHTED,MODE_GATORJAW,0)),4);
     Alligator_teeth=NormalizeDouble((iAlligator(objectSymbol,timeFrame,8,0,5,0,3,0,MODE_EMA,PRICE_WEIGHTED,MODE_GATORTEETH,0)),4);
     Alligator_lips=NormalizeDouble((iAlligator(objectSymbol,timeFrame,8,0,5,0,3,0,MODE_EMA,PRICE_WEIGHTED,MODE_GATORLIPS,0)),4);
     double Alligator_jaw_1=NormalizeDouble((iAlligator(objectSymbol,timeFrame,8,0,5,0,3,0,MODE_EMA,PRICE_WEIGHTED,MODE_GATORJAW,1)),4);
     double Alligator_teeth_1=NormalizeDouble((iAlligator(objectSymbol,timeFrame,8,0,5,0,3,0,MODE_EMA,PRICE_WEIGHTED,MODE_GATORTEETH,1)),4);
     double Alligator_lips_1=NormalizeDouble((iAlligator(objectSymbol,timeFrame,8,0,5,0,3,0,MODE_EMA,PRICE_WEIGHTED,MODE_GATORLIPS,1)),4);
     Force3=NormalizeDouble((iForce(objectSymbol,timeFrame,3,MODE_EMA,PRICE_WEIGHTED,0)),4);
     //技术分析
     if(Alligator_lips>Alligator_teeth&&Alligator_lips_1<=Alligator_teeth_1)
         result="UpCross";
     if(Alligator_lips=Alligator_teeth_1)
         result="DownCross";
     if(Alligator_lips>Alligator_teeth&&Alligator_teeth>Alligator_jaw)
         result="Rise"; 
     if(Alligator_lips
         result="Fall";
     if(Force3>Filter&&result=="Rise")
         result="Buy";
     if(Force3<-Filter&&result=="Fall")
         result="Sell";
     return result;
}

double LotsOptimized(double RiskValue)
{
     //最大可开仓手数   ?最好用净值 不要用余额
     double iLots=NormalizeDouble((AccountBalance()*RiskValue/100/MarketInfo(Symbol(),MODE_MARGINREQUIRED)),2);

     //如果上一次订单亏损,本次开仓量减半
     OrderSelect(OrdersHistoryTotal()-1,SELECT_BY_POS,MODE_HISTORY);
     if(OrderProfit()<0)iLots=iLots/2;

     if(iLots<0.01){iLots=0;Print("保证金余额不足");}
     return iLots;
}
void OnTick()
{
   //选择当前订单
   OrderSelect(0,SELECT_BY_POS);   //?
   //显示市场信息
   string labelDoc="星期"+DayOfWeek()+"市场时间: "+Year()+"-"+Month()+"-"+Day()+" "+Hour()+":"+Seconds();
   iSetLabel("时间栏",labelDoc,200,0,9,"Verdana",Red);
   labelDoc="市场信号: "+ReturnMarketInformation()+"当前订单盈亏:"+DoubleToStr(OrderProfit(),2);
   iSetLabel("信息栏",labelDoc,5,20,10,"Verdana",Blue);
   //周五20点停止交易,如果盈利订单平仓
   if(DayOfWeek()==5 && Hour()>=20 && Minute()>=0)
   {
     if(OrderProfit()>0)OrderClose(OrderTicket(),OrderLots(),Ask,0);
//? Ask bid Close[0] 
    
     return;
   }
   //新开仓订单时间不足一个时间周期,不做任何操作;
   if(OrdersTotal()>0)
   {
   //空仓的时候这里如果return就不会开仓了? 30*60   应该是半个小时
     if((TimeCurrent()-OrderOpenTime())<=PERIOD_M30*60) return; 
   }

   //开仓操作
   if(Symbol()==objectSymbol && OrdersTotal()==0)
   {
     if(ReturnMarketInformation()=="Buy")
         iOpenOrders("Buy",LotsOptimized(MaxRisk),StopLoss,TakeProfit);
     if(ReturnMarketInformation()=="Sell")
         iOpenOrders("Sell",LotsOptimized(MaxRisk),StopLoss,TakeProfit);
   }


   //感觉有问题没有选择就直接用了么, 可能正常因为这个EA最多只持仓一个订单
   //止盈操作
   if(OrderProfit()>0)
   {
     if(Symbol()==objectSymbol&&OrdersTotal()==1&&OrderType()==OP_BUY&&ReturnMarketInformation()=="DownCross")
         OrderClose(OrderTicket(),OrderLots(),Ask,0);
     if(Symbol()==objectSymbol&&OrdersTotal()==1&&OrderType()==OP_SELL&&ReturnMarketInformation()=="UpCross")
         OrderClose(OrderTicket(),OrderLots(),Bid,0);
   }
   //止损操作
   if(OrderProfit()<0)
   {
     if(Symbol()==objectSymbol&&OrdersTotal()==1&&OrderType()==OP_BUY&&Alligator_lips
         OrderClose(OrderTicket(),OrderLots(),Ask,0);
     if(Symbol()==objectSymbol&&OrdersTotal()==1&&OrderType()==OP_SELL&&Alligator_lips>Alligator_jaw)
         OrderClose(OrderTicket(),OrderLots(),Bid,0);
   }
   return;
}
20160617
1.  //最大开仓量
double testMaxLot()
{
     double myLots = (AccountEquity()/MarketInfo(Symbol(),MODE_MARGINREQUIRED));
     return (NormalizeDouble(myLots,2));
}
2. //使用本函数 最好不要设置止盈止损功能
  int iOpenOrders(string myType,double myLots,int myLossStop,int myTakeProfit)
  {
     int ticketNo=-1;
     int mySpread=MarketInfo(Symbol(),MODE_SPREAD);//点差 手续费 市场滑点
     double sl_buy=(myLossStop<=0)?0:(Ask-myLossStop*Point);
     double tp_buy=(myTakeProfit<=0)?0:(Ask+myTakeProfit*Point);
     double sl_sell=(myLossStop<=0)?0:(Bid+myLossStop*Point);
     double tp_sell=(myTakeProfit<=0)?0:(Bid-myTakeProfit*Point);

     if(myType=="Buy")
      ticketNo=OrderSend(Symbol(),OP_BUY,myLots,Ask,mySpread,sl_buy,tp_buy);
     if(myType=="Sell")
      ticketNo=OrderSend(Symbol(),OP_SELL,myLots,Bid,mySpread,sl_sell,tp_sell);

     return ticketNo;
  }

  void iCloseOrders(string myType)
  {
     int cnt=OrdersTotal();
     int i;
     //选择当前持仓单
     if(OrderSelect(cnt-1,SELECT_BY_POS)==false)return;
     if(myType=="All")
     {
         for(i=cnt-1;i>=0;i--)
         {
              if(OrderSelect(i,SELECT_BY_POS)==false)continue;
              else OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0); //? Close[0]与OrderClosePrice()有区别么
         }
     }
     else if(myType=="Buy")
     {
         for(i=cnt-1;i>=0;i--)
         {
              if(OrderSelect(i,SELECT_BY_POS)==false)continue;
              else if(OrderType()==OP_BUY) OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0);
         }
     }
     else if(myType=="Sell")
     {
         for(i=cnt-1;i>=0;i--)
         {
              if(OrderSelect(i,SELECT_BY_POS)==false)continue;
              else if(OrderType()==OP_SELL) OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0);
         }
     }
     else if(myType=="Profit")
     {
         for(i=cnt-1;i>=0;i--)
         {
              if(OrderSelect(i,SELECT_BY_POS)==false)continue;
              else if(OrderProfit()>0) OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0);
         }
     }
     else if(myType=="Loss")
     {
         for(i=cnt-1;i>=0;i--)
         {
              if(OrderSelect(i,SELECT_BY_POS)==false)continue;
              else if(OrderProfit()<0) OrderClose(OrderTicket(),OrderLots(),OrderClosePrice(),0);
         }
     }
  }

3.// 建议尽量不要对持仓订单设置止损价格,而是用程序计算平仓
void iMoveStopLoss(int myStopLoss)
{
     int Cnt=OrdersTotal()-1;
     if(OrdersTotal()>0)
     {
         for(int i=Cnt;i>=0;i--)
         {
              if(OrderSelect(i,SELECT_BY_POS)==false)continue;
              else
              {
                  if(OrderProfit()>0&& OrderType()==OP_BUY && ((Close[0]-OrderStopLoss())>2*myStopLoss*Point))
                  {
                       OrderModify(OrderTicket(),OrderOpenPrice(),Ask+Point*myStopLoss,OrderTakeProfit(),0);
                  }
                  if(OrderProfit()>0&& OrderType()==OP_SELL && ((OrderStopLoss()-Close[0])>2*myStopLoss*Point))
                  {
                       OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point*myStopLoss,OrderTakeProfit(),0);
                  }
              }
         }
     }
}
4.// 感觉会有问题,应该用大于小于, 
bool EAValid=false;
bool iTimeControl(int myStartHour,int myStartMinute,int myStopHour,int myStopMinute)
{
     if(Hour()==0&&Minute()==0)EAValid=false;//new day
     if(Hour()==myStopHour&&Minute()==myStopMinute+1) //满足结束时间
     {
         EAValid=false;
     }
     if(Hour()==myStartHour&&Minute()==myStartMinute)//满足开始时间
     {
         EAValid=true;
     }
   return EAValid;
}

bool iValidTime(string myStartTime,string myEndTime,bool myServerTime)
{
     bool myValue=false;
     int myST=StrToTime(myStartTime);
     int myET=StrToTime(myEndTime);
     if(myST>myET)myET+=1440*60;
     datetime tempDateTime=(myServerTime==false)?TimeLocal():TimeCurrent();
     if(tempDateTime>myST&&tempDateTime
     if(myST==myET)myValue=true;
     return(myValue);
}

5.
void iSetLabel(string lableName,string lableDoc,int x,int y,int docSize,string docStyle,color docColor)
{
     iDisplayInfo(lableName,lableDoc,0,x,y,docSize,docStyle,docColor);
}

void iDisplayInfo(string lableName,string labelDoc,int corner,int x,int y,int docSize,string docStyle,color docColor)
{
     if(corner==-1)return;
     ObjectCreate(lableName,OBJ_LABEL,0,0,0);
     ObjectSetText(lableName,labelDoc,docSize,docStyle,docColor);
     ObjectSet(lableName,OBJPROP_CORNER,corner);//确定左边原点,0左上角,1右上角,2左下角,3右下角,-1不显示
     ObjectSet(lableName,OBJPROP_XDISTANCE,x);
     ObjectSet(lableName,OBJPROP_YDISTANCE,y);
}

void iBarText(string myString,int myBars,double myPrice,int docSize,string docStyle,color myColor)
{
     string TextBarString=myString+Time[myBars];//文本名称
     ObjectCreate(TextBarString,OBJ_TEXT,"",Time[myBars],myPrice);//建立一个文本对象
     ObjectSetText(TextBarString,myString,docSize,docStyle,myColor);//文字内容
}

6.
int LineNo=0;
string myObjectName="Line"+LineNo;
void iDrawLine(string myObjectName,int myFirstTime,double myFirstPrice,int mySecondTime,double mySecondPrice)
{
     iTwoPointsLine(myObjectName,myFirstTime,myFirstPrice,mySecondTime,mySecondPrice,STYLE_DOT,Green);
}
void iTwoPointsLine(string myObjectName,int myFirstTime,double myFirstPrice,int mySecondTime,double mySecondPrice,int myLineStyle,color myLineColor)
{
     ObjectCreate(myObjectName,OBJ_TREND,0,myFirstTime,myFirstPrice,mySecondTime,mySecondPrice);//确定两点坐标
     ObjectSet(myObjectName,OBJPROP_STYLE,myLineStyle);//线型
     ObjectSet(myObjectName,OBJPROP_COLOR,myLineColor); //线色
     ObjectSet(myObjectName,OBJPROP_WIDTH,1); //线宽
     ObjectSet(myObjectName,OBJPROP_BACK,false); //设置背景无效
     ObjectSet(myObjectName,OBJPROP_RAY,false);//设置射线无效
}
void SetObj(int orderTicket,int orderType,int openTime,int openPrice,int closeTime,int closePrice)
{
     string objectName="订单号-"+DoubleToStr(orderTicket,0);
     ObjectCreate(objectName,OBJ_TREND,0,openTime,openPrice,closeTime,closePrice);
     color clr=(orderType==0)?Green:Red;
     ObjectSet(objectName,OBJPROP_COLOR,clr);
     ObjectSet(objectName,OBJPROP_STATE,STYLE_DOT);
     ObjectSet(objectName,OBJPROP_WIDTH,1);
     ObjectSet(objectName,OBJPROP_BACK,false);
     ObjectSet(objectName,OBJPROP_RAY,false);
}
void DrawRectangle(string myRectangleName,color myColor,int myFirstTime,double myFirstPrice,int mySecondTime,double mySecondPrice,bool myBackColor)
{
     ObjectCreate(myRectangleName,OBJ_RECTANGLE,0,myFirstTime,myFirstPrice,mySecondTime,mySecondPrice);
     ObjectSet(myRectangleName,OBJPROP_COLOR,myColor);
     ObjectSet(myRectangleName,OBJPROP_BACK,myBackColor);
}

7.
void iDrawSign(string mySignal,double myPrice)
{
     string myObjectName;
     if(mySignal=="Buy")
     {
         myObjectName="BuyPoint-"+Time[0];
         ObjectCreate(myObjectName,OBJ_ARROW,0,Time[0],myPrice);
         ObjectSet(myObjectName,OBJPROP_COLOR,Green);
         ObjectSet(myObjectName,OBJPROP_ARROWCODE,241);
     }
     if(mySignal=="Sell")
     {
         myObjectName="SellPoint-"+Time[0];
         ObjectCreate(myObjectName,OBJ_ARROW,0,Time[0],myPrice);
         ObjectSet(myObjectName,OBJPROP_COLOR,Red);
         ObjectSet(myObjectName,OBJPROP_ARROWCODE,242);
     }
     if(mySignal=="GreenMark")
     {
         myObjectName="GreenMark-"+Time[0];
         ObjectCreate(myObjectName,OBJ_ARROW,0,Time[0],myPrice);
         ObjectSet(myObjectName,OBJPROP_COLOR,Green);
         ObjectSet(myObjectName,OBJPROP_ARROWCODE,162);
     }
     if(mySignal=="RedMark")
     {
         myObjectName="RedMark-"+Time[0];
         ObjectCreate(myObjectName,OBJ_ARROW,0,Time[0],myPrice);
         ObjectSet(myObjectName,OBJPROP_COLOR,Red);
         ObjectSet(myObjectName,OBJPROP_ARROWCODE,162);
     }
}
void iDrawSign2(string myType,int myBarPos,double myPrice,color myColor)
{
     string myObjectName;
     if(myType=="HLine")
     {
         myObjectName=myType+Time[myBarPos];
         ObjectCreate(myObjectName,OBJ_HLINE,0,Time[myBarPos],myPrice);
         ObjectSet(myObjectName,OBJPROP_COLOR,myColor);
     }
     else if(myType=="VLine")
     {
         myObjectName=myType+Time[myBarPos];
         ObjectCreate(myObjectName,OBJ_VLINE,0,Time[myBarPos],myPrice);
         ObjectSet(myObjectName,OBJPROP_COLOR,myColor);
     }
}

法2
//屏幕上做出开仓标记,红色箭头为卖出订单,绿色为买入订单 
void Draw_Mark(int myTicket)
{
     if(myTicket>0)//有效的订单
     {
         string myObjectName="Arrow-"+DoubleToStr(myTicket,0);
         //选定当前订单
         OrderSelect(OrdersTotal()-1,SELECT_BY_POS);
         int arrowValue; color arrowColor;
         if(OrderType()==OP_BUY){arrowValue=221;arrowColor=Green;}
         if(OrderType()==OP_SELL){arrowValue=222;arrowColor=Red;}
         ObjectCreate(myObjectName,OBJ_ARROW,0,Time[0],OrderOpenPrice());
         ObjectSet(myObjectName,OBJPROP_ARROWCODE,arrowValue);
         ObjectSet(myObjectName,OBJPROP_COLOR,arrowColor);
     }

}
8./ *快慢指标线交叉信号    周期短的是快线,周期长的是慢线
参数说明, 当前快线,当前慢线,前一个快线,前一个慢线    
返回值:UpCross 上穿   DownCross 下穿 N/A 无穿越
*/
string iCrossSignal(double myFast0,double mySlow0,double myFast1,double mySlow1)
{
     string result="N/A";
     if(myFast0>mySlow0 && myFast1<=mySlow1) result="UpCross";
     if(myFast0=mySlow1) result="DownCross";
     return result;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值