下面是一個EA,我將其用作模板,為我使用的系統構建EA。我不是一個經驗豐富的程序員,我希望這個項目能讓我建立我對mql4的了解。下面的代碼運行良好但是我只停留在一小部分。此EA目前一次只開放一筆交易。我希望同步交易成為可能。有人可以快速查看代碼,讓我知道哪個部分限制了這一點。我相信它可能是檢查位置部分。非常感謝。


Quote Originally Posted by ;
#define SIGNAL_NONE 0
#define SIGNAL_BUY 1
#define SIGNAL_SELL 2
#define SIGNAL_CLOSEBUY 3
#define SIGNAL_CLOSESELL 4
extern int MagicNumber = 0;
extern bool SignalMail = False;
extern bool EachTickMode = False;
extern double Lots = 1.0;
extern int Slippage = 3;
extern bool UseStopLoss = False;
extern int StopLoss = 30;
extern bool UseTakeProfit = False;
extern int TakeProfit = 60;
extern bool UseTrailingStop = False;
extern int TrailingStop = 30;
int BarCount;
當前;
bool TickCheck =假;
// ----------------------------------------------- -------------------
//|專家初始化函數|
// ----------------------------------------------- -------------------
int init(){
BarCount =酒吧;
if(EachTickMode)Current = 0; else Current = 1;
返回(0);
}
// ----------------------------------------------- -------------------
//|專家取消初始化功能|
// ----------------------------------------------- -------------------
int deinit(){
返回(0);
}
// ----------------------------------------------- -------------------
//|專家啟動功能|
// ----------------------------------------------- -------------------
int start(){
int Order = SIGNAL_NONE;
int Total,Ticket;
double StopLossLevel,TakeProfitLevel;

if(EachTickMode Bars!= BarCount)TickCheck = False;
Total = OrdersTotal();
Order = SIGNAL_NONE;
// ----------------------------------------------- -------------------
//|變量開始|
// ----------------------------------------------- -------------------

double Buy1_1 = iOpen(NULL,PERIOD_H4,Current 0);
double Buy1_2 = iCustom(NULL,PERIOD_H4,AndrewFX HiLo,0,Current 0);
double Sell1_1 = iOpen(NULL,PERIOD_H4,Current 0);
double Sell1_2 = iCustom(NULL,PERIOD_H4,AndrewFX HiLo,0,Current 0);
double CloseBuy1_1 = iOpen(NULL,PERIOD_H4,Current 0);
double CloseBuy1_2 = iCustom(NULL,PERIOD_H4,AndrewFX HiLo,0,Current 0);
double CloseSell1_1 = iOpen(NULL,PERIOD_H4,Current 0);
double CloseSell1_2 = iCustom(NULL,PERIOD_H4,AndrewFX HiLo,0,Current 0);

// ----------------------------------------------- -------------------
//|變量結束|
// ----------------------------------------------- -------------------
//檢查位置
bool IsTrade = False;
for(int i = 0; i lt; Total; i ){
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderType()lt; = OP_SELL OrderSymbol()== Symbol()){
IsTrade = True;
if(OrderType()== OP_BUY){
//關
// ----------------------------------------------- -------------------
//|信號開始(退出購買)|
// ----------------------------------------------- -------------------
if(CloseBuy1_1 lt; CloseBuy1_2)Order = SIGNAL_CLOSEBUY;

// ----------------------------------------------- -------------------
//|信號結束(退出購買)|
// ----------------------------------------------- -------------------
if(Order == SIGNAL_CLOSEBUY((EachTickMode!TickCheck)||(!EachTickMode(Bars!= BarCount)))){
OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,MediumSeaGreen);
if(SignalMail)SendMail([Signal Alert],[ Symbol() ] DoubleToStr(Bid,Digits) Close Buy);
if(!EachTickMode)BarCount = Bars;
IsTrade = False;
繼續;
}
//追踪止損
if(UseTrailingStop TrailingStop gt; 0){
if(Bid - OrderOpenPrice()gt; Point * TrailingStop){
if(OrderStopLoss()lt; Bid - Point * TrailingStop){
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point * TrailingStop,OrderTakeProfit(),0,MediumSeaGreen);
if(!EachTickMode)BarCount = Bars;
繼續;
}
}
}
} else {
//關
// ----------------------------------------------- -------------------
//|信號開始(退出賣出)|
// ----------------------------------------------- -------------------
if(CloseSell1_1 gt; CloseSell1_2)Order = SIGNAL_CLOSESELL;

// ----------------------------------------------- -------------------
//|信號結束(退出賣出)|
// ----------------------------------------------- -------------------
if(Order == SIGNAL_CLOSESELL((EachTickMode!TickCheck)||(!EachTickMode(Bars!= BarCount)))){
OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,DarkOrange);
if(SignalMail)SendMail([Signal Alert],[ Symbol() ] DoubleToStr(Ask,Digits) Close Sell);
if(!EachTickMode)BarCount = Bars;
IsTrade = False;
繼續;
}
//追踪止損
if(UseTrailingStop TrailingStop gt; 0){
if((OrderOpenPrice() - Ask)gt;(Point * TrailingStop)){
if((OrderStopLoss()gt;(Ask Point * TrailingStop))||(OrderStopLoss()== 0)){
OrderModify(OrderTicket(),OrderOpenPrice(),Ask Point * TrailingStop,OrderTakeProfit(),0,DarkOrange);
if(!EachTickMode)BarCount = Bars;
繼續;
}
}
}
}
}
}
// ----------------------------------------------- -------------------
//|信號開始(輸入)|
// ----------------------------------------------- -------------------
if(Buy1_1 gt; Buy1_2)訂單= SIGNAL_BUY;
if(Sell1_1 lt; Sell1_2)Order = SIGNAL_SELL;

// ----------------------------------------------- -------------------
//|信號結束|
// ----------------------------------------------- -------------------
//購買
if(Order == SIGNAL_BUY((EachTickMode!TickCheck)||(!EachTickMode(Bars!= BarCount)))){
if(!IsTrade){
//檢查可用保證金
if(AccountFreeMargin()lt;(1000 * Lots)){
打印(我們沒有錢。免費保證金=,AccountFreeMargin());
返回(0);
}
if(UseStopLoss)StopLossLevel = Ask - StopLoss * Point;否則StopLossLevel = 0.0;
if(UseTakeProfit)TakeProfitLevel = Ask TakeProfit * Point;否則TakeProfitLevel = 0.0;
Ticket = OrderSend(符號(),OP_BUY,Lots,Ask,Slippage,StopLossLevel,TakeProfitLevel,Buy(# MagicNumber ),MagicNumber,0,DodgerBlue);
if(Ticket gt; 0){
if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)){
打印(買入訂單已打開:,OrderOpenPrice());
if(SignalMail)SendMail([Signal Alert],[ Symbol() ] DoubleToStr(Ask,Digits) Open Buy);
} else {
打印(錯誤打開購買訂單:,GetLastError());
}
}
if(EachTickMode)TickCheck = True;
if(!EachTickMode)BarCount = Bars;
返回(0);
}
}
//賣
if(Order == SIGNAL_SELL((EachTickMode!TickCheck)||(!EachTickMode(Bars!= BarCount)))){
if(!IsTrade){
//檢查可用保證金
if(AccountFreeMargin()lt;(1000 * Lots)){
打印(我們沒有錢。免費保證金=,AccountFreeMargin());
返回(0);
}
if(UseStopLoss)StopLossLevel = Bid StopLoss * Point;否則StopLossLevel = 0.0;
if(UseTakeProfit)TakeProfitLevel = Bid - TakeProfit * Point;否則TakeProfitLevel = 0.0;
Ticket = OrderSend(符號(),OP_SELL,Lots,Bid,Slippage,StopLossLevel,TakeProfitLevel,Sell(# MagicNumber ),MagicNumber,0,DeepPink);
if(Ticket gt; 0){
if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)){
打印(賣出訂單:,OrderOpenPrice());
if(SignalMail)SendMail([Signal Alert],[ Symbol() ] DoubleToStr(Bid,Digits) Open Sell);
} else {
打印(錯誤打開賣單:,GetLastError());
}
}
if(EachTickMode)TickCheck = True;
if(!EachTickMode)BarCount = Bars;
返回(0);
}
}
if(!EachTickMode)BarCount = Bars;
返回(0);
}
// ----------------------------------------------- -------------------
Quote Originally Posted by ;
#define SIGNAL_NONE 0
#define SIGNAL_BUY 1
#define SIGNAL_SELL 2
#define SIGNAL_CLOSEBUY 3
#define SIGNAL_CLOSESELL 4
extern int MagicNumber = 0;
extern bool SignalMail = False;
extern bool EachTickMode = False;
extern double Lots = 1.0;
extern int Slippage = 3;
extern bool UseStopLoss = False;
extern int StopLoss = 30;
extern bool UseTakeProfit = False;
extern int TakeProfit = 60;
extern bool UseTrailingStop = False;
extern int TrailingStop = 30;
int BarCount;
當前;
bool TickCheck =假;
// ----------------------------------------------- -------------------
//|專家初始化函數|
// ----------------------------------------------- -------------------
int init(){
BarCount =酒吧;
if(EachTickMode)Current = 0; else Current = 1;
返回(0);
}
// ----------------------------------------------- -------------------
//|專家取消初始化功能|
// ----------------------------------------------- -------------------
int deinit(){
返回(0);
}
// ----------------------------------------------- -------------------
//|專家啟動功能|
// ----------------------------------------------- -------------------
int start(){
int Order = SIGNAL_NONE;
int Total,Ticket;
double StopLossLevel,TakeProfitLevel;

if(EachTickMode Bars!= BarCount)TickCheck = False;
Total = OrdersTotal();
Order = SIGNAL_NONE;
// ----------------------------------------------- -------------------
//|變量開始|
// ----------------------------------------------- -------------------

double Buy1_1 = iOpen(NULL,PERIOD_H4,Current 0);
double Buy1_2 = iCustom(NULL,PERIOD_H4,AndrewFX HiLo,0,Current 0);
double Sell1_1 = iOpen(NULL,PERIOD_H4,Current 0);
double Sell1_2 = iCustom(NULL,PERIOD_H4,AndrewFX HiLo,0,Current 0);
double CloseBuy1_1 = iOpen(NULL,PERIOD_H4,Current 0);
double CloseBuy1_2 = iCustom(NULL,PERIOD_H4,AndrewFX HiLo,0,Current 0);
double CloseSell1_1 = iOpen(NULL,PERIOD_H4,Current 0);
double CloseSell1_2 = iCustom(NULL,PERIOD_H4,AndrewFX HiLo,0,Current 0);

// ----------------------------------------------- -------------------
//|變量結束|
// ----------------------------------------------- -------------------
//檢查位置
bool IsTrade = False;
for(int i = 0; i lt; Total; i ){
OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderType()lt; = OP_SELL OrderSymbol()== Symbol()){
IsTrade = True;
if(OrderType()== OP_BUY){
//關
// ----------------------------------------------- -------------------
//|信號開始(退出購買)|
// ----------------------------------------------- -------------------
if(CloseBuy1_1 lt; CloseBuy1_2)Order = SIGNAL_CLOSEBUY;

// ----------------------------------------------- -------------------
//|信號結束(退出購買)|
// ----------------------------------------------- -------------------
if(Order == SIGNAL_CLOSEBUY((EachTickMode!TickCheck)||(!EachTickMode(Bars!= BarCount)))){
OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,MediumSeaGreen);
if(SignalMail)SendMail([Signal Alert],[ Symbol() ] DoubleToStr(Bid,Digits) Close Buy);
if(!EachTickMode)BarCount = Bars;
IsTrade = False;
繼續;
}
//追踪止損
if(UseTrailingStop TrailingStop gt; 0){
if(Bid - OrderOpenPrice()gt; Point * TrailingStop){
if(OrderStopLoss()lt; Bid - Point * TrailingStop){
OrderModify(OrderTicket(),OrderOpenPrice(),Bid-Point * TrailingStop,OrderTakeProfit(),0,MediumSeaGreen);
if(!EachTickMode)BarCount = Bars;
繼續;
}
}
}
} else {
//關
// ----------------------------------------------- -------------------
//|信號開始(退出賣出)|
// ----------------------------------------------- -------------------
if(CloseSell1_1 gt; CloseSell1_2)Order = SIGNAL_CLOSESELL;

// ----------------------------------------------- -------------------
//|信號結束(退出賣出)|
// ----------------------------------------------- -------------------
if(Order == SIGNAL_CLOSESELL((EachTickMode!TickCheck)||(!EachTickMode(Bars!= BarCount)))){
OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,DarkOrange);
if(SignalMail)SendMail([Signal Alert],[ Symbol() ] DoubleToStr(Ask,Digits) Close Sell);
if(!EachTickMode)BarCount = Bars;
IsTrade = False;
繼續;
}
//追踪止損
if(UseTrailingStop TrailingStop gt; 0){
if((OrderOpenPrice() - Ask)gt;(Point * TrailingStop)){
if((OrderStopLoss()gt;(Ask Point * TrailingStop))||(OrderStopLoss()== 0)){
OrderModify(OrderTicket(),OrderOpenPrice(),Ask Point * TrailingStop,OrderTakeProfit(),0,DarkOrange);
if(!EachTickMode)BarCount = Bars;
繼續;
}
}
}
}
}
}
// ----------------------------------------------- -------------------
//|信號開始(輸入)|
// ----------------------------------------------- -------------------
if(Buy1_1 gt; Buy1_2)訂單= SIGNAL_BUY;
if(Sell1_1 lt; Sell1_2)Order = SIGNAL_SELL;

// ----------------------------------------------- -------------------
//|信號結束|
// ----------------------------------------------- -------------------
//購買
if(Order == SIGNAL_BUY((EachTickMode!TickCheck)||(!EachTickMode(Bars!= BarCount)))){
if(!IsTrade){
//檢查可用保證金
if(AccountFreeMargin()lt;(1000 * Lots)){
打印(我們沒有錢。免費保證金=,AccountFreeMargin());
返回(0);
}
if(UseStopLoss)StopLossLevel = Ask - StopLoss * Point;否則StopLossLevel = 0.0;
if(UseTakeProfit)TakeProfitLevel = Ask TakeProfit * Point;否則TakeProfitLevel = 0.0;
Ticket = OrderSend(符號(),OP_BUY,Lots,Ask,Slippage,StopLossLevel,TakeProfitLevel,Buy(# MagicNumber ),MagicNumber,0,DodgerBlue);
if(Ticket gt; 0){
if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)){
打印(買入訂單已打開:,OrderOpenPrice());
if(SignalMail)SendMail([Signal Alert],[ Symbol() ] DoubleToStr(Ask,Digits) Open Buy);
} else {
打印(錯誤打開購買訂單:,GetLastError());
}
}
if(EachTickMode)TickCheck = True;
if(!EachTickMode)BarCount = Bars;
返回(0);
}
}
//賣
if(Order == SIGNAL_SELL((EachTickMode!TickCheck)||(!EachTickMode(Bars!= BarCount)))){
if(!IsTrade){
//檢查可用保證金
if(AccountFreeMargin()lt;(1000 * Lots)){
打印(我們沒有錢。免費保證金=,AccountFreeMargin());
返回(0);
}
if(UseStopLoss)StopLossLevel = Bid StopLoss * Point;否則StopLossLevel = 0.0;
if(UseTakeProfit)TakeProfitLevel = Bid - TakeProfit * Point;否則TakeProfitLevel = 0.0;
Ticket = OrderSend(符號(),OP_SELL,Lots,Bid,Slippage,StopLossLevel,TakeProfitLevel,Sell(# MagicNumber ),MagicNumber,0,DeepPink);
if(Ticket gt; 0){
if(OrderSelect(Ticket,SELECT_BY_TICKET,MODE_TRADES)){
打印(賣出訂單:,OrderOpenPrice());
if(SignalMail)SendMail([Signal Alert],[ Symbol() ] DoubleToStr(Bid,Digits) Open Sell);
} else {
打印(錯誤打開賣單:,GetLastError());
}
}
if(EachTickMode)TickCheck = True;
if(!EachTickMode)BarCount = Bars;
返回(0);
}
}
if(!EachTickMode)BarCount = Bars;
返回(0);
}
// ----------------------------------------------- -------------------