MQL4零基礎(chǔ)入門

初識 EA智能交易

所謂EA智能外匯全自動交易系統(tǒng),就是將您自己或別人的外匯交易策略用特殊的編程語言(MQL)編寫成一個電腦軟件程序(Expert Advisor), 讓電腦按照您事先設(shè)定好的條件自動地為您買賣與交易,當然贏虧結(jié)果取決于您的自動交易系統(tǒng)設(shè)計得好壞。

EA交易的優(yōu)點:

  • 由于是電腦自動下單,可以保證更快的下單,平倉速度,可以更敏感地響應(yīng)價格變動和趨勢變動。

  • 電腦可以克服人性中的弱點,該買則買,該賣則賣,無猶豫,無貪心,贏則不狂妄,虧也不沮喪,避免了情緒化操作。

  • 電腦可以每天24小時不間斷地監(jiān)控行情,并在適當?shù)臅r機和點位自動進出場,完全不用人工的干預,可以讓您夜晚安枕入眠,白天安心從事別的工作。

制作第一個外匯腳本

只需1分鐘,跟著視頻的步驟來執(zhí)行第一個EA程序吧

// 將下面的代碼復制到腳本中,這是一個下單指令
//這是個以當前價格當前貨幣對開0.1手多單且無止損止盈的下單腳本

 OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0,"多單",123,0,clrNONE);

編輯器操作

  • 新建腳本
    腳本可以進行訂單操作,在頁面加載只執(zhí)行一次,無需卸載。
void OnStart()
  {
    腳本主體
  }

  • 新建指標
    自定義指標的編寫比較復雜,將在進階課程中講解。
  • 新建EA
// EA初始化函數(shù),在EA執(zhí)行前需要確定的事情需要寫在這個函數(shù)里面,比如網(wǎng)絡(luò)連接是否正常,賬戶是否是確定賬戶等。
int OnInit()
  {
   return(INIT_SUCCEEDED);
  }

// 這個函數(shù)是EA卸載時執(zhí)行的代碼,一般不用,但保留格式
void OnDeinit(const int reason)
  {

  }

// 程序的主體內(nèi)容寫在這個函數(shù)里面,這個函數(shù)在圖表貨幣對每次報價的時候執(zhí)行一次。如果報價不變就不會執(zhí)行,即周末的時候,報價不變,代碼也不會執(zhí)行。
void OnTick()
  {

  }

  • MQL4文件夾

MQL4文件夾是MT4平臺涉及智能交易的文件夾,其中EA,指標和腳本分別處于不同的文件夾中,放錯位置將無法執(zhí)行。

Experts   :存放EA
Files     :MQL4可以進行文件操作,文件一般會在這個文件夾中
Images    : 用不到
Include   :函數(shù)庫文件夾,用于存放函數(shù)庫文件,在寫EA和腳本時可以調(diào)用這個文件中的函數(shù)
Indicators:指標文件夾,存放指標
Libraries :動態(tài)鏈接庫文件夾,借用動態(tài)鏈接庫文件可擴展MQL4的功能
Logs      :日志文件夾,運行EA的日志存放在這個地方
Presets   :EA的參數(shù)可以保存,放在這個文件夾中
Project   :用不到
Scripts   :腳本文件夾,存放腳本 
  • MetaEditor編輯器操作
    MetaEditor編輯器是專門用于編寫MQL4語言的編輯器,需要掌握以下功能:

    • 新建文檔 : 創(chuàng)建新文件
    • 編譯文檔 : 編寫寫好的代碼
    • 查看編譯信息 : 查看錯誤信息,調(diào)試代碼
    • 打開導航欄 : 方便查找文件
    • 查看幫助文件 : 幫助操作

變量

變量,是指沒有固定的值,在程序中可以改變的數(shù)。與之相對應(yīng)的是不變量,即一旦設(shè)定,在整個程序中的值都不會變,也不允許改變。

<strong>注:程序中所有變量都需要先定義,后使用。</strong>

變量的定義

變量的定義,有三個部分組成:

數(shù)據(jù)類型 變量名=初始值 結(jié)束符

  • 數(shù)據(jù)類型:表明變量屬于哪一類
  • 變量名:是字母a-z,A-Z,數(shù)字0-9,以及“_”的組合,不能以字母開頭。
  • 結(jié)束符:分號“;”。分號必須為英文分號,代碼中所有字符(除注釋)必須為英文字符。

常量的定義

常量的定義,有三部分

#define 常量名 常量值

  • 不變量使用#define定義
  • 不變量需在程序開始時定義。
  • 不需要結(jié)束符
  • 不變量的變量名,不能夠再定義成變量
#property copyright "shiyingpan"
#property link      "https://www.myfxlab.cn"
#property version   "1.00"
#property strict

//----常量的定義----//

#define N 10 //常量標識符(#define) 常量名(N) 常量值(10) 注:不需要分號結(jié)束


//----變量的定義----//

int var=1; //數(shù)據(jù)類型(int) 變量名(var)=初始值(1) 結(jié)束符(;)
double lot=1.2; //數(shù)據(jù)類型(double) 變量名(lot)=初始值(1.2) 結(jié)束符(;)



void OnStart()
  {
//----- 整數(shù)-----//
   int a=1,b=2,c;
   c=a+b;
   Print("a=",a,",b=",b,",a+b=",c);
   c=a-b;
   Print("a=",a,",b=",b,",a-b=",c);
   c=a*b;
   Print("a=",a,",b=",b,",a*b=",c);
   c=a/b; //----這是整除----//
   Print("a=",a,",b=",b,",a/b=",c);
   c=a%b; 
   Print("a=",a,",b=",b,",a%b=",c);
//----- 浮點數(shù)-----//
   double d=1,e=2,f;
   f=d+e;
   Print("d=",d,",e=",e,",d+e=",f);
   f=d-e;
   Print("d=",d,",e=",e,",d-e=",f);
   f=d*e;
   Print("d=",d,",e=",e,",d*e=",f);
   f=d/e;
   Print("d=",d,",e=",e,",d/e=",f);

//----- 布爾量-----//
   bool g=true,h=false,i;
   
   i= g && h;
   Print("g=",g,",h=",h,",g/h=",i);
   
   i= g || h;
   Print("g=",g,",h=",h,",g/h=",i);

//----- 字符串-----//
   string j="ni",k="hao",m;
   m=j+k;
   Print("j=",j,",k=",k,",j/k=",m);

//----- 時間量-----//
   datetime now;
   now=TimeCurrent();
   Print("now=",now,"now_int=",int(now));
   now=now-60;   //----時間量可以轉(zhuǎn)化為整型作為時間的計算方式,1個單位代表1秒
   Print("now-60=",now);
   
//----- 顏色變量-----//
// 顏色變量一般不定義,直接使用。   

  }

數(shù)據(jù)類型

整數(shù)

整數(shù)是不帶小數(shù)的數(shù)字,包含負整數(shù),零和正整數(shù)。

  • 整數(shù)的定義:int a=10;
  • 整數(shù)轉(zhuǎn)化為浮點數(shù): b=double(a);
  • 整數(shù)轉(zhuǎn)化為字符串: string c=IntegerToString(a);
  • 整除:整數(shù)除整數(shù),結(jié)果仍然是整數(shù),整數(shù)除浮點數(shù),結(jié)果為浮點數(shù)。int a=1,b=2; Print(a/b);結(jié)果為0

浮點數(shù)

浮點數(shù)是帶有小數(shù)部分的數(shù)字。

  • 浮點數(shù)的定義:double a=10;
  • 浮點數(shù)轉(zhuǎn)化為整數(shù): b=int(a);只保留整數(shù)部分
  • 浮點數(shù)轉(zhuǎn)化為字符串: string c=DoubleToString(a,2);2表示保留2位小數(shù)

布爾量

布爾量是表示真假的量,只有True(真)和False(假)兩種情況。

布爾量的定義:bool a=True;
布爾量一般不做類型轉(zhuǎn)換。

字符串

字符串可以理解為一段文字,可以是英文或中文。

  • 字符串的定義:string a="你好";字符串需要用英文引號包含起來。
  • 字符串轉(zhuǎn)化為整型 :如果字符串中都是整數(shù)可轉(zhuǎn)化為整數(shù),b=StringToInteger(a)
  • 字符串轉(zhuǎn)化為浮點數(shù):如果字符串是浮點數(shù),則可以轉(zhuǎn)化為浮點數(shù),b=StringToDouble(a)
  • 字符串轉(zhuǎn)化為時間量 : 如果字符串是日期,則可以轉(zhuǎn)化為時間量,b=StringToTime()
  • 字符串的拼接:string a ="你",b="好"; c=a+b; Print(c); "你好"

時間量

時間量是MQL4表示時間的變量。

  • 時間量的定義:datetime a=D'2017.12.25 12:12:00'; 時,分,秒可以不寫,默認為00:00:00
  • 時間戳:以1970.01.01 為0,到現(xiàn)在的秒數(shù),所以時間量也可以是整型,參與數(shù)學運算。
  • 時間量轉(zhuǎn)化為字符串:b=TimeToString(a)

顏色變量

在MQL4中表示顏色的量,一般是使用的可用以下幾種

  • 紅色:clrRed
  • 黃色:clrYellow
  • 白色:clrWhite
  • 綠色:clrGreen
  • 無顏色:clrNone

運算符

  • 數(shù)字相加
  • 自加
  • 時間相加
  • 字符串相加

  • 數(shù)字減
  • 自減
  • 時間減

在程序中,乘法符號用""(shift+8)表示 int a=1,b=2; double c=ab; Print(c);輸出 2

在程序中,除法符號用"/"表示,除數(shù)不能為零。 int a=1;double b=2; double c=a/b;Print(c);輸出 0.5

取余數(shù)

取余數(shù),又稱為模運算,在程序中有重要的作用,取余數(shù)的符號是"%"(shift+5),取余數(shù)的雙方必須是整數(shù)。余數(shù),類似于3除2,余1。

指數(shù)運算

指數(shù)運算需要使用到系統(tǒng)自帶的函數(shù):MathPow(底數(shù),次方數(shù))。

邏輯運算

邏輯運算符是配合控制語句使用。其運算結(jié)果是布爾量,只有“真”或“假”。

  • ==:等于等于,若兩邊一致,則為 True(真),否則為False(假)
  • !=:不等于,若兩邊不一致,則為True(真),否則為False(假)
  • > :大于,左邊大于右邊為True(真),否則為False(假)
  • >= :大于等于,左邊大于或等于右邊為True(真),否則為False(假)
  • < :小于,左邊小于于右邊為True(真),否則為False(假)
  • <= :小于等于,左邊小于或等于右邊為True(真),否則為False(假)
  • && :邏輯與,左邊和右邊都為True(真)時,結(jié)果為True(真),否則為False(假)
  • || :邏輯或,左邊和右邊都為False(假)時,結(jié)果為False(假),否則為True(真)。
  • ?。悍遣僮?,也稱取反操作。
#property copyright "shiyingpan"
#property link      "https://www.myfxlab.cn"
#property version   "1.00"
#property strict

void OnStart()
  {
//-------加-------// 
   int a=1;
   double b=2,c;
   c=a+b;
   Print("a=",a,",b=",b,",a+b=",c);
   
   string j="ni",k="hao",m;
   m=j+k;
   Print("j=",j,",k=",k,",j/k=",m);  
   
   Print("a=",a);
   a++;          //自加1
   Print("a",a);
 
//-------減-------//
   c=a-b;
   Print("a=",a,",b=",b,",a-b=",c);
   
   Print("a=",a);
   a--;          //自加1
   Print("a",a);
 
//-------乘-------// 
   c=a*b;
   Print("a=",a,",b=",b,",a*b=",c);

//-------除-------// 
   int aa=1,bb=2,cc;
   cc=aa/bb; //----這是整除----//
   Print("aa=",aa,",bb=",bb,",aa/bb=",cc);
   double d=1,e=2,f;
   f=d/e; //----結(jié)果帶小數(shù)---//
   Print("d=",d,",e=",e,",d/e=",f);
//-------取余-------// 
   cc=aa%bb; //----這是整除取余----//
   Print("aa=",aa,",bb=",bb,",aa%bb=",cc);

//-------指數(shù)運算-------//
   c=MathPow(b,a); //----b的a次方----//
   Print("a=",a,",b=",b,",b^a=",c);

//-------邏輯運算-------// 
   bool r;
   r= a>b;
   Print("a=",a,",b=",b,",a>b=",r); 
   r=!(a>b);
   Print("a=",a,",b=",b,",a>b=",r); 
   r= a>=b;
   Print("a=",a,",b=",b,",a>=b=",r); 
   r= a<b;
   Print("a=",a,",b=",b,",a<b=",r); 
   r= a<=b;
   Print("a=",a,",b=",b,",a<=b=",r);       
   r= a==b;
   Print("a=",a,",b=",b,",a==b=",r); 
   r= a>b || a==b;
   Print("a=",a,",b=",b,",a>b || a==b=",r); 
   r= a>=b || a==b;
   Print("a=",a,",b=",b,",a>=b || a==b=",r); 

  }

標示

程序中標示,包含自定義變量的名稱,函數(shù)的名稱等。標示的作用主要是便于讀代碼。

  • 良好的標示有助于讀懂代碼,修改代碼。
  • 雜亂的標示會增加破譯代碼策略的難度。

保留字

每種編程語言都會有些關(guān)鍵字,是保留下來的,不能夠當變量名使用。保留字都有特定的顏色。不能夠使用保留字的名稱作為變量。

  • 類型保留字
  • 函數(shù)保留字
  • 訂單保留字
  • 其他保留字

結(jié)束符

在程序主體中,每句代碼的結(jié)束,都要以英文分號";"結(jié)束。

注釋

程序中注釋不會影響程序的運行。

  • 注釋一行:使用"http://"
  • 注釋一段:使用"http://* 注釋內(nèi)容 /*/"
#property copyright "shiyingpan"
#property link      "https://www.myfxlab.cn"
#property version   "1.00"
#property strict

void OnStart()
  {
//保留字,系統(tǒng)留用。保留字有特殊的顏色
//類型
int,double,datetime,string
//函數(shù)
OrderSend(),OrderClose(),OnStart();
//訂單
OP_BUY,OP_SELL
//其他保留字
Ask,Bid 
//中文字符  
注意中文字符的顏色,MQL4支持中文字符。  
  
//結(jié)束符
每句代碼的結(jié)束都要以英文分號(;)結(jié)束

  
// 這是一行注釋

/* 

這是一段注釋

*/
  }

函數(shù)

函數(shù)本質(zhì)上是一段代碼,只不過這段代碼經(jīng)常被使用或者這段代碼實現(xiàn)特定的功能。函數(shù)并不是一定要用,用了有以下優(yōu)勢:

  • 代碼框架清晰
  • 代碼重用性提高,減少代碼量
  • 函數(shù)可以嵌套函數(shù),可實現(xiàn)遞歸

下單函數(shù)

MQL4中只有一個下單函數(shù):Ordersend(),下單函數(shù)的屬性,參照訂單參數(shù)。

發(fā)送訂單時,幣種是必須要給予的。幣種的類型是string(字符串類型的),可以有以下幾種表現(xiàn)形式:

  • 調(diào)用Symbol():Symbol()函數(shù)是MQL4內(nèi)部定義函數(shù),返回當前加載EA圖表中的幣種。
  • 直接指定:使用字符串指定,如歐元兌美元可直接使用"EURUSD"
  • 間接指定:定義一個貨幣對字符串,然后使用這個字符串
#property copyright "shiyingpan"
#property link      "https://www.myfxlab.cn"
#property version   "1.00"
#property strict

void OnStart()
  {
   string 幣種=Symbol(),注釋="測試";
   double 單量=0.1,開倉價=Ask;
   int 滑點=3,魔數(shù)=1243;
   double 止損=開倉價-100*Point,止盈=開倉價+100*Point;
   datetime 過期時間=0;
   
   int ticket=0;
   ticket=OrderSend(幣種,OP_BUY,單量,開倉價,滑點,止損,止盈,注釋,魔數(shù),過期時間,clrNONE);
   
   if(ticket==0)
      Print("開單失敗!錯誤原因:",GetLastError());
   else
      Print("開單成功!訂單號:",ticket);   
      
   GetSymInfo();  
 
  }

//----獲得幣種的各種信息----//
void GetSymInfo()
{
   string 貨幣對名="EURUSD";
   double 買價,賣價,多倉隔夜利息,空倉隔夜利息,最低點位;
   double 點差,報價位數(shù);
   double 最低單量;
   
   買價=MarketInfo(貨幣對名,MODE_ASK);
   賣價=MarketInfo(貨幣對名,MODE_BID);
   多倉隔夜利息=MarketInfo(貨幣對名,MODE_SWAPLONG);
   空倉隔夜利息=MarketInfo(貨幣對名,MODE_SWAPSHORT);
   點差=MarketInfo(貨幣對名,MODE_SPREAD);
   報價位數(shù)=MarketInfo(貨幣對名,MODE_DIGITS);
   最低點位=MarketInfo(貨幣對名,MODE_POINT);
   最低單量=MarketInfo(貨幣對名,MODE_MINLOT);
   
   Print("貨幣對      :", 貨幣對名     );
   Print("買價        :", 買價         );
   Print("賣價        :", 賣價         );
   Print("多倉隔夜利息:", 多倉隔夜利息 );
   Print("空倉隔夜利息:", 空倉隔夜利息 );
   Print("點差        :", 點差         );
   Print("報價位數(shù)    :", 報價位數(shù)     );
   Print("最低點位    :", 最低點位     );
   Print("最低單量    :", 最低單量     );  

}  

/*-----訂單類型-------
多單 OP_BUY
空單 OP_SELL

買入限價 OP_BUYLIMIT 等價位跌倒某值買入
買入止損 OP_SELLLIMIT 等價格漲到某值賣出

賣出限價 OP_BUYSTOP  等價格漲到某值買入(一般為突破多掛單)
賣出止損 OP_SELLSTOP 等價格跌倒某值賣出(一般為跌破空掛單)

----------------------*/

修改訂單函數(shù)

MQL4中修改訂單,使用OrderModify()函數(shù)。
對于已經(jīng)下單的訂單,能夠修改的參數(shù)只有止損和止盈。
對于掛單,可以修改止損,止盈和開倉價

  • 修改訂單
#property copyright "shiyingpan"
#property link      "https://www.myfxlab.cn"
#property version   "1.00"
#property strict

/*----------修改訂單使用 OrderModify() 函數(shù)---
    本例將所有  多單的止損擴大100點
                空單的止盈擴大100點  
---------------------------------------------*/
bool res;

void OnStart()
  {
   for(int i=0;i<OrdersTotal();i++)
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==True)
      {
         if(OrderType()==OP_BUY || OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP)
         {
            if(OrderStopLoss()==0)
            {
               res=OrderModify(OrderTicket(),OrderOpenPrice(),MarketInfo(OrderSymbol(),MODE_ASK)-100*MarketInfo(OrderSymbol(),MODE_POINT),OrderTakeProfit(),0,clrNONE);
               if(res==false)
                  Print("多單修改失敗,訂單號:",OrderTicket());
            }  
            else
            {
               res=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss()+100*MarketInfo(OrderSymbol(),MODE_POINT),OrderTakeProfit(),0,clrNONE);
               if(res==false)
                  Print("空單修改失敗,訂單號:",OrderTicket());
            }
         }
         if(OrderType()==OP_SELL || OrderType()==OP_SELLLIMIT || OrderType()==OP_SELLSTOP)
         {
            if(OrderTakeProfit()==0)
            {
               res=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),MarketInfo(OrderSymbol(),MODE_BID)-100*MarketInfo(OrderSymbol(),MODE_POINT),0,clrNONE);
               if(res==false)
                  Print("空單修改失敗,訂單號:",OrderTicket());                 
            }
            else
            {
               res=OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),OrderTakeProfit()-100*MarketInfo(OrderSymbol(),MODE_POINT),0,clrNONE);
               if(res==false)
                  Print("空單修改失敗,訂單號:",OrderTicket());              
            }        
         }
      }   
   }
  }

平倉函數(shù)

MQL4對已開倉位使用平倉函數(shù),可將倉位按當前價平倉。

刪除訂單函數(shù)

MQL4對未執(zhí)行的掛單使用刪除訂單函數(shù),將此掛單刪除。

#property copyright "shiyingpan"
#property link      "https://www.myfxlab.cn"
#property version   "1.00"
#property strict
/*---------------------------------------------
平倉函數(shù)的使用需要慎重對待,必須使用訂單號平倉,
一般的使用方式為先選中訂單,然后再平倉。
本例:在圖表周期中,若K線收盤價低于10日均線時,
      平掉本貨幣對多倉
----------------------------------------------*/
input int 周期=10;
int 魔數(shù)=1243;

int OnInit()
  {
   return(INIT_SUCCEEDED);
  }
void OnDeinit(const int reason)
  {
  
  }
void OnTick()
  {
   double ma_value=iMA(Symbol(),0,周期,0,MODE_EMA,PRICE_CLOSE,0);//--調(diào)用均線指標
   double close_price=iClose(Symbol(),0,0); //------調(diào)用收盤價
   
   if(close_price<ma_value)
   {
      for(int i=0;i<OrdersTotal();i++)
      {
         if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==True)
         { 
//----------------選擇需要平倉的訂單---------------、、           
            if(OrderSymbol()==Symbol() && OrderMagicNumber()==魔數(shù))
            {
//----------------開倉單使用OrderClose() ----------//
               if(OrderType()==OP_BUY)
               {
                  if(!OrderClose(OrderTicket(),OrderLots(),MarketInfo(Symbol(),MODE_BID),3,clrNONE))
                     Alert("平倉失敗,錯誤號:",GetLastError());
               }
//-----------------掛單使用 OrderDelete() ----------//               
               if(OrderType()==OP_BUYLIMIT || OrderType()==OP_BUYSTOP)
               {
                  if(!OrderDelete(OrderTicket(),clrNONE))
                     Alert("刪除掛單失敗,錯誤號:",GetLastError());
               }               
               
               
            }
          }  
       }     
   }
  }

自定義函數(shù)

自定義函數(shù)用于實現(xiàn)特定的功能。函數(shù)有以下屬性

  • 函數(shù)的形式:函數(shù)需寫在主體程序之外,如下:

  • 返回值:函數(shù)可以帶有返回值,定義類型與返回類型需一致。

  • 無返回值:對于不需要返回值的函數(shù),定義類型用void。

/*----函數(shù)的基本結(jié)構(gòu)-----//
返回值類型 函數(shù)名(參數(shù)類型 參數(shù)定義,參數(shù)類型 參數(shù)定義)
{
   函數(shù)主體
}
*/
#property copyright "shiyingpan"
#property link      "https://www.myfxlab.cn"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| OnStart()也是一個函數(shù),并且沒有返回值                                   |
//+------------------------------------------------------------------+
void OnStart()
  {
   Acc_check(); //---沒有參數(shù)
   int a=1,b=2,c=3,res;
   res = add(a,b,c,4);//---有4個參數(shù),與函數(shù)定義需一一對應(yīng)
   Print("res:",res);
  }
  
void Acc_check()
{
   if(!IsDemo())
   {
      Alert("非模擬賬戶,請謹慎操作!");
   }   
   return;
}

int add(int aa,int bb,int cc,int dd)
{
   int r=0;
   r=aa+bb+cc+dd;
   return r;
}

控制語句

控制語句是實現(xiàn)策略的主要方法,在程序中非常重要,控制語句的執(zhí)行代碼需要用大括號括起來。

if條件判斷

if是條件判斷語句,若條件為True(真)時,執(zhí)行if內(nèi)容,否則不執(zhí)行。

if-else條件判斷

若if判斷條件為真,執(zhí)行if的內(nèi)容,否則執(zhí)行else里面的內(nèi)容。

#property copyright "shiyingpan"
#property link      "https://www.myfxlab.cn"
#property version   "1.00"
#property strict

void OnStart()
  {
//-----23點到1點之間不交易------//
   if(TimeHour(TimeCurrent())==23 || TimeHour(TimeCurrent())==0) //--函數(shù)帶有括號()
   {
      Alert("非交易時段");
      return;
   }
   
//--- else 并不是一定要有,根據(jù)需要-------//
//--- 本根K線RSI指標高于50下空單,低于50下多單----//
   double rsi_value=iRSI(Symbol(),0,14,PRICE_CLOSE,0);
   int ticket=0;
   if(rsi_value>50)
   {
      ticket=OrderSend(Symbol(),OP_SELL,0.1,Bid,3,0,0,"測試",1242,0,clrNONE);
      
      if(ticket==0)
         Print("開單失??!錯誤原因:",GetLastError());
      else
         Print("開單成功!訂單號:",ticket);      
   }
   else
   {
      ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0,"測試",1242,0,clrNONE);
      
      if(ticket==0)
         Print("開單失??!錯誤原因:",GetLastError());
      else
         Print("開單成功!訂單號:",ticket); 
   }
   
//--- 本根K線RSI指標高于70下空單,低于30下多單,其他情況不下單----// 

   if(rsi_value>70)
   {
      ticket=OrderSend(Symbol(),OP_SELL,0.1,Bid,3,0,0,"測試",1242,0,clrNONE);
      
      if(ticket==0)
         Print("開單失??!錯誤原因:",GetLastError());
      else
         Print("開單成功!訂單號:",ticket);      
   }
   else if(rsi_value<30)   // else if 追加判斷
   {
      ticket=OrderSend(Symbol(),OP_BUY,0.1,Ask,3,0,0,"測試",1242,0,clrNONE);
      
      if(ticket==0)
         Print("開單失敗!錯誤原因:",GetLastError());
      else
         Print("開單成功!訂單號:",ticket); 
   }
   
  }

for循環(huán)

for循環(huán),在任何編程語言中都占據(jù)重要的地位。很復雜的類似操作,使用for循環(huán)將會變得簡單。
for循環(huán)需要定義循環(huán)次數(shù),通常情況下使用如下:

#property copyright "shiyingpan"
#property link      "https://www.myfxlab.cn"
#property version   "1.00"
#property strict

void OnStart()
  {
//-----做1到100的累加----//

   int sum=0;
   for(int i=1;i<=100;i++)
   {
      sum=sum+i;
   }
   Print("1到100的累加結(jié)果為:",sum);
   
   int i=1;
   sum=0;
   while(i<=100)
   {
      sum=sum+i;
   }

   Print("1到100的累加結(jié)果為:",sum);
  }

while循環(huán)

while循環(huán)是一直循環(huán),只要條件滿足就執(zhí)行,在沒有停止條件的情況下會一直執(zhí)行。沒有停止條件的情況下,會無限循環(huán),導致程序陷入死循環(huán),有時會崩潰。在可選的條件下,盡量不用。

#property copyright "shiyingpan"
#property link      "https://www.myfxlab.cn"
#property version   "1.00"
#property strict

void OnStart()
  {
//-----做1到100的累加----//

   int sum=0;
   int i=1;
   while(i<=100)
   {
      sum=sum+i;
   }

   Print("1到100的累加結(jié)果為:",sum);
  }

switch-case條件選擇

根據(jù)switch的內(nèi)容,選定相應(yīng)的case。使用switch-case時,需要事情擬定所有可能的情況。

#property copyright "shiyingpan"
#property link      "https://www.myfxlab.cn"
#property version   "1.00"
#property strict

void OnStart()
  {
//-----選擇下單方式----//

   int type=OP_BUY;
   
   switch(type)
   {
      case OP_BUY:
         Print("下多單");
         break;
      case OP_BUYLIMIT:
         Print("下限價買入掛單");
         break;
      case OP_SELL:      
         Print("下空單");
         break;
      default:
         Print("其他情況,不操作");
         break;   
   }
  }

continue 循環(huán)中斷

在循環(huán)語句的代碼中,執(zhí)行到continue時,將直接進入下一次循環(huán)。

break 循環(huán)結(jié)束

在循環(huán)語句的代碼中,執(zhí)行到break時,循環(huán)將被終止。

訂單參數(shù)

每一個訂單都有自己的參數(shù),在使用OrderSelect()選中訂單的前提下,可使用內(nèi)置函數(shù)調(diào)用訂單參數(shù)。在未選中的情況下,無法返回參數(shù)。選擇訂單的兩種方法:

  • 按訂單號選擇
  • 按訂單序列選擇

訂單號

使用OrderTicket()返回訂單得訂單號,數(shù)據(jù)類型為整型

幣種

使用OrderSymbol()函數(shù)返回訂單幣種,類型為string(字符串)

單量

使用OrderLots()函數(shù)返回訂單單量,類型為一個浮點數(shù)

交易類型

使用OrderType()函數(shù)返回訂單方向,可能是OP_BUY,OP_SELL,OP_BUY_LIMIT,OP_BUY_STOP,OP_SELL_LIMIT,OP_SELL_STOP中的其中一個

開倉價

使用OrderOpenPrice()返回訂單得訂單開倉價,數(shù)據(jù)類型為整型

開倉時間

使用OrderOpenTime()返回訂單得訂單開倉時間,數(shù)據(jù)類型為整型

止損

使用OrderStopLoss()返回訂單得訂單止損,數(shù)據(jù)類型為整型

止盈

使用OrderTakeProfit()返回訂單得訂單止盈,數(shù)據(jù)類型為整型

注釋

使用OrderComment()返回訂單得訂單注釋,數(shù)據(jù)類型為整型

魔數(shù)

使用OrderMagicNumber()返回訂單得訂單魔數(shù),數(shù)據(jù)類型為整型

平倉價

使用OrderClosePrice()返回訂單得訂單平倉價,數(shù)據(jù)類型為整型

平倉時間

使用OrderCloseTime()返回訂單得訂單平倉時間,數(shù)據(jù)類型為整型

浮盈

使用OrderProfit()返回訂單得訂單浮盈,數(shù)據(jù)類型為整型

隔夜利息

使用OrderSwap()返回訂單得訂單隔夜利息,數(shù)據(jù)類型為整型

手續(xù)費

使用OrderCommission()返回訂單得訂單手續(xù)費,數(shù)據(jù)類型為整型

#property copyright "shiyingpan"
#property link      "https://www.myfxlab.cn"
#property version   "1.00"
#property strict
/*--------------------------------
選擇訂單參數(shù)是智能交易中的重要步驟。
----------------------------------*/
void OnStart()
  {
//-------------通用格式-----------
   for(int i=0;i<=OrdersTotal()-1;i++) //---------選擇持倉訂單
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)) 
      {
         Print("訂單號:",OrderTicket()); 
         Print("幣種:",OrderSymbol());
         Print("方向:",OrderType()); 
         Print("單量:",OrderLots()); 
         Print("開倉價:",OrderOpenPrice()); 
         Print("開倉時間:",OrderOpenTime()); 
         Print("止損:",OrderStopLoss()); 
         Print("止盈:",OrderTakeProfit()); 
         Print("收盤價:",OrderClosePrice()); 
         Print("收盤時間:",OrderCloseTime()); 
         Print("魔數(shù):",OrderMagicNumber()); 
         Print("注釋:",OrderComment());
         Print("浮盈:",OrderProfit());
         Print("隔夜利息:",OrderSwap());
         Print("手續(xù)費:",OrderCommission());    
      }
   }
   
   for(int i=0;i<=OrdersHistoryTotal()-1;i++) //---------選擇歷史訂單
   {
      if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY))
      {
         Print("訂單號:",OrderTicket()); 
         Print("幣種:",OrderSymbol());
         Print("方向:",OrderType()); 
         Print("單量:",OrderLots()); 
         Print("開倉價:",OrderOpenPrice()); 
         Print("開倉時間:",OrderOpenTime()); 
         Print("止損:",OrderStopLoss()); 
         Print("止盈:",OrderTakeProfit()); 
         Print("收盤價:",OrderClosePrice()); 
         Print("收盤時間:",OrderCloseTime()); 
         Print("魔數(shù):",OrderMagicNumber()); 
         Print("注釋:",OrderComment());
         Print("浮盈:",OrderProfit());
         Print("隔夜利息:",OrderSwap());
         Print("手續(xù)費:",OrderCommission());    
      }
   }
   
//------------直接按訂單號選擇-------
   int ticket=123;
   
   if(OrderSelect(ticket,SELECT_BY_TICKET)) //----直接按訂單號選擇需輸入正確訂單號,很少用
   {
         Print("訂單號:",OrderTicket()); 
         Print("幣種:",OrderSymbol());
         Print("方向:",OrderType()); 
         Print("單量:",OrderLots()); 
         Print("開倉價:",OrderOpenPrice()); 
         Print("開倉時間:",OrderOpenTime()); 
         Print("止損:",OrderStopLoss()); 
         Print("止盈:",OrderTakeProfit()); 
         Print("收盤價:",OrderClosePrice()); 
         Print("收盤時間:",OrderCloseTime()); 
         Print("魔數(shù):",OrderMagicNumber()); 
         Print("注釋:",OrderComment());
         Print("浮盈:",OrderProfit());
         Print("隔夜利息:",OrderSwap());
         Print("手續(xù)費:",OrderCommission()); 
   }   
  }


編程風格

養(yǎng)成良好的編程風格

  • 良好的書寫格式,有助于理清思路,檢驗策略,查找錯誤,美觀,這是基本功。
  • 多使用函數(shù),對于一個功能塊,使用一個函數(shù)代替。
  • 多次使用的字符串或數(shù)字,用一個標示符代替。
  • 使用MetaEditor的自帶編程風格工具。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容