初識 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的自帶編程風格工具。