以下は私が使用するシステム用のEAを構築するためのテンプレートとして使用しているEAです。私は経験豊富なプログラマーではなく、このプロジェクトでmql4についての知識を身につけることができると願っています。以下のコードはうまくいきますが、私は1つの小さな部分にこだわっています。このEAは現在、一度に1つの取引をオープンしています。私は同時取引を可能にしたいと思います。誰かがコードをすばやく見て、どの部分がこれを制限しているかを教えてください。私はそれがチェックポジションセクションであると信じています。どうもありがとう。
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スリッパ= 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;
int現在の;
bool TickCheck = False;
// ----------------------------------------------- -------------------
//|エキスパート初期化関数|
// ----------------------------------------------- -------------------
int init(){
BarCount =バー;
if(EachTickMode)Current = 0;それ以外の場合はCurrent = 1;
return(0);
}
// ----------------------------------------------- -------------------
//|エキスパート初期化機能|
// ----------------------------------------------- -------------------
int deinit(){
return(0);
}
// ----------------------------------------------- -------------------
//|エキスパートスタート機能|
// ----------------------------------------------- -------------------
int start(){
int Order = SIGNAL_NONE;
合計、チケット;
double StopLossLevel、TakeProfitLevel;
if(EachTickMode Bars!= BarCount)TickCheck = False;
合計= OrdersTotal();
注文= SIGNAL_NONE;
// ----------------------------------------------- -------------------
//|変数の開始|
// ----------------------------------------------- -------------------
Double Buy1_1 = iOpen(NULL、PERIOD_H4、Current 0);
Double Buy1_2 = iCustom(NULL、PERIOD_H4、AndrewFX HiLo、0、Current 0);
ダブルSell1_1 = iOpen(NULL、PERIOD_H4、Current 0);
ダブル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);
ダブルCloseSell1_1 = iOpen(NULL、PERIOD_H4、現在 0);
ダブル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){
//閉じる
// ----------------------------------------------- -------------------
//|シグナルの開始(Exit 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 =バー;
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 =バー;
持続する;
}
}
}
} 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 =バー;
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 =バー;
持続する;
}
}
}
}
}
}
// ----------------------------------------------- -------------------
//|信号の開始(エントリ)|
// ----------------------------------------------- -------------------
if(Buy1_1 gt; Buy1_2)Order = 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());
return(0);
}
if(UseStopLoss)StopLossLevel = Ask - StopLoss * Point;そうでなければStopLossLevel = 0.0;
もし(UseTakeProfit)TakeProfitLevel = Ask TakeProfit * Point;そうでなければTakeProfitLevel = 0.0;
Ticket = OrderSend(Symbol()、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 =バー;
return(0);
}
}
//売る
if(Order == SIGNAL_SELL(EachTickMode!TickCheck)||(!EachTickMode(Bars!= BarCount))))){
if(!IsTrade){
//余白を確認する
if(AccountFreeMargin()lt;(1000 * Lots)){
印刷(私たちはお金はありません。無料余白=、AccountFreeMargin());
return(0);
}
if(UseStopLoss)StopLossLevel = Bid StopLoss * Point;そうでなければStopLossLevel = 0.0;
もし(UseTakeProfit)TakeProfitLevel = Bid - TakeProfit * Point;そうでなければTakeProfitLevel = 0.0;
Ticket = OrderSend(Symbol()、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 =バー;
return(0);
}
}
if(!EachTickMode)BarCount =バー;
return(0);
}
// ----------------------------------------------- -------------------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スリッパ= 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;
int現在の;
bool TickCheck = False;
// ----------------------------------------------- -------------------
//|エキスパート初期化関数|
// ----------------------------------------------- -------------------
int init(){
BarCount =バー;
if(EachTickMode)Current = 0;それ以外の場合はCurrent = 1;
return(0);
}
// ----------------------------------------------- -------------------
//|エキスパート初期化機能|
// ----------------------------------------------- -------------------
int deinit(){
return(0);
}
// ----------------------------------------------- -------------------
//|エキスパートスタート機能|
// ----------------------------------------------- -------------------
int start(){
int Order = SIGNAL_NONE;
合計、チケット;
double StopLossLevel、TakeProfitLevel;
if(EachTickMode Bars!= BarCount)TickCheck = False;
合計= OrdersTotal();
注文= SIGNAL_NONE;
// ----------------------------------------------- -------------------
//|変数の開始|
// ----------------------------------------------- -------------------
Double Buy1_1 = iOpen(NULL、PERIOD_H4、Current 0);
Double Buy1_2 = iCustom(NULL、PERIOD_H4、AndrewFX HiLo、0、Current 0);
ダブルSell1_1 = iOpen(NULL、PERIOD_H4、Current 0);
ダブル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);
ダブルCloseSell1_1 = iOpen(NULL、PERIOD_H4、現在 0);
ダブル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){
//閉じる
// ----------------------------------------------- -------------------
//|シグナルの開始(Exit 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 =バー;
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 =バー;
持続する;
}
}
}
} 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 =バー;
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 =バー;
持続する;
}
}
}
}
}
}
// ----------------------------------------------- -------------------
//|信号の開始(エントリ)|
// ----------------------------------------------- -------------------
if(Buy1_1 gt; Buy1_2)Order = 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());
return(0);
}
if(UseStopLoss)StopLossLevel = Ask - StopLoss * Point;そうでなければStopLossLevel = 0.0;
もし(UseTakeProfit)TakeProfitLevel = Ask TakeProfit * Point;そうでなければTakeProfitLevel = 0.0;
Ticket = OrderSend(Symbol()、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 =バー;
return(0);
}
}
//売る
if(Order == SIGNAL_SELL(EachTickMode!TickCheck)||(!EachTickMode(Bars!= BarCount))))){
if(!IsTrade){
//余白を確認する
if(AccountFreeMargin()lt;(1000 * Lots)){
印刷(私たちはお金はありません。無料余白=、AccountFreeMargin());
return(0);
}
if(UseStopLoss)StopLossLevel = Bid StopLoss * Point;そうでなければStopLossLevel = 0.0;
もし(UseTakeProfit)TakeProfitLevel = Bid - TakeProfit * Point;そうでなければTakeProfitLevel = 0.0;
Ticket = OrderSend(Symbol()、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 =バー;
return(0);
}
}
if(!EachTickMode)BarCount =バー;
return(0);
}
// ----------------------------------------------- -------------------