Jestem zielony z programowania i nie wiem co trzeba dopisać aby w sytuacji gdzy jest otwarta pozycja buy i następuje nowa decyzja z automatu o otwarciu pozycji sell to wszystkie pozycje buy zostaną zamknięte.
Czy może mi ktoś pomóc?
Kod: Zaznacz cały
include <stderror.mqh>
#include <stdlib.mqh>
extern bool open_new_orders=true;
extern bool use_tp1=false;
extern bool use_tp2=false;
extern bool use_tp3=false;
extern bool use_notp=true;
extern int time_limit=300;
extern int min_tp=10;
extern int mtp1=20;
extern int mtp2=40;
extern int mtp3=60;
extern double lots=0;
extern int stop_loss=40;
extern bool use_trailing_stop=false;
extern int trailing_stop=30;
extern bool trail_only_on_profit=true;
extern bool use_logarythmic_stop=true;
extern double log_a=1.154;
// bardziej agresywny 1.133;
// mniej agresywny 1.154;
extern int log_b=40;
extern int min_sl=10;
extern bool use_secure_profit=false;
extern int secure_profit=1;
extern int secure_profit_distance=29;
extern string periodBegin="0:00";
extern string periodEnd="5:30";
extern string tradeEnd="17:00";
extern double fibo1=0.618;
extern double fibo2=1.618;
extern double fibo3=3.236;
extern int ma_period=1;
extern int ma_method=MODE_SMA;
extern int ma_price=PRICE_CLOSE;
string comment="luktom panca eagle ea";
int magic=5923;
int init() {
if(lots<MarketInfo(Symbol(),MODE_MINLOT)) {
lots=MarketInfo(Symbol(),MODE_MINLOT);
}
start();
return(0);
}
int start() {
if(use_logarythmic_stop) {
logarythmic_stop();
}
if(use_trailing_stop) {
trail();
}
if(use_secure_profit) {
secure();
}
if OP_BUY Close SELL {
if OP_SELL Close BUY {
string s="\nluktom panca eagle ea\n\n";
datetime begin=StrToTime(periodBegin);
datetime end=StrToTime(periodEnd);
datetime tend=StrToTime(tradeEnd);
if(TimeCurrent()>end) {
if(TimeCurrent()>tend) {
s=s+"No more trading today";
deinit();
Comment(s);
return(0);
}
int barBegin=iBarShift(NULL,0,begin);
int barEnd=iBarShift(NULL,0,end);
double pHigh=High[iHighest(NULL,0,MODE_HIGH,barBegin-barEnd,barEnd)];
double pLow=Low[iLowest(NULL,0,MODE_LOW,barBegin-barEnd,barEnd)];
double cma=iMA(NULL,0,ma_period,0,ma_method,ma_price,0);
double pma=iMA(NULL,0,ma_period,0,ma_method,ma_price,1);
s=s+"High: " + DoubleToStr(pHigh,Digits) + "\n";
s=s+"Low: " + DoubleToStr(pLow,Digits) + "\n";
s=s+"SMA5: " + DoubleToStr(cma,Digits) + "\n";
s=s+"BPH: " + DoubleToStr((3*pHigh)-(Close[1]+Close[2]),Digits) + "\n";
s=s+"BPL: " + DoubleToStr((3*pLow)-(Close[1]+Close[2]),Digits) + "\n";
s=s+"Range: " + DoubleToStr((pHigh-pLow)/Point,0) + "\n";
if(ObjectFind("lpee_high")==-1) {
ObjectCreate("lpee_high",OBJ_HLINE,0,Time[0],pHigh);
ObjectSet("lpee_high",OBJPROP_COLOR,Red);
} else {
ObjectSet("lpee_high",OBJPROP_PRICE1,pHigh);
}
if(ObjectFind("lpee_low")==-1) {
ObjectCreate("lpee_low",OBJ_HLINE,0,Time[0],pLow);
ObjectSet("lpee_low",OBJPROP_COLOR,Red);
} else {
ObjectSet("lpee_low",OBJPROP_PRICE1,pLow);
}
double ttp1=pHigh+fibo1*(pHigh-pLow);
double ttp2=pHigh+fibo2*(pHigh-pLow);
double ttp3=pHigh+fibo3*(pHigh-pLow);
double btp1=pLow-fibo1*(pHigh-pLow);
double btp2=pLow-fibo2*(pHigh-pLow);
double btp3=pLow-fibo3*(pHigh-pLow);
if(ObjectFind("lpee_ttp1")==-1 && use_tp1) {
ObjectCreate("lpee_ttp1",OBJ_HLINE,0,Time[0],ttp1);
ObjectSet("lpee_ttp1",OBJPROP_COLOR,Green);
}
if(ObjectFind("lpee_ttp2")==-1 && use_tp2) {
ObjectCreate("lpee_ttp2",OBJ_HLINE,0,Time[0],ttp2);
ObjectSet("lpee_ttp2",OBJPROP_COLOR,Green);
}
if(ObjectFind("lpee_ttp3")==-1 && use_tp3) {
ObjectCreate("lpee_ttp3",OBJ_HLINE,0,Time[0],ttp3);
ObjectSet("lpee_ttp3",OBJPROP_COLOR,Green);
}
if(ObjectFind("lpee_btp1")==-1 && use_tp1) {
ObjectCreate("lpee_btp1",OBJ_HLINE,0,Time[0],btp1);
ObjectSet("lpee_btp1",OBJPROP_COLOR,Green);
}
if(ObjectFind("lpee_btp2")==-1 && use_tp2) {
ObjectCreate("lpee_btp2",OBJ_HLINE,0,Time[0],btp2);
ObjectSet("lpee_btp2",OBJPROP_COLOR,Green);
}
if(ObjectFind("lpee_btp3")==-1 && use_tp3) {
ObjectCreate("lpee_btp3",OBJ_HLINE,0,Time[0],btp3);
ObjectSet("lpee_btp3",OBJPROP_COLOR,Green);
}
/*
if(ObjectFind("lpee_tmtp1")==-1 && mtp1>0) {
ObjectCreate("lpee_tmtp1",OBJ_HLINE,0,Time[0],pHigh+mtp1*Point);
ObjectSet("lpee_tmtp1",OBJPROP_COLOR,Green);
}
if(ObjectFind("lpee_tmtp2")==-1 && mtp2>0) {
ObjectCreate("lpee_tmtp2",OBJ_HLINE,0,Time[0],pHigh+mtp2*Point);
ObjectSet("lpee_tmtp2",OBJPROP_COLOR,Green);
}
if(ObjectFind("lpee_tmtp3")==-1 && mtp3>0) {
ObjectCreate("lpee_tmtp3",OBJ_HLINE,0,Time[0],pHigh+mtp3*Point);
ObjectSet("lpee_tmtp3",OBJPROP_COLOR,Green);
}
if(ObjectFind("lpee_bmtp1")==-1 && mtp1>0) {
ObjectCreate("lpee_bmtp1",OBJ_HLINE,0,Time[0],pLow-mtp1*Point);
ObjectSet("lpee_bmtp1",OBJPROP_COLOR,Green);
}
if(ObjectFind("lpee_bmtp1")==-1 && mtp1>0) {
ObjectCreate("lpee_bmtp1",OBJ_HLINE,0,Time[0],pLow-mtp1*Point);
ObjectSet("lpee_bmtp1",OBJPROP_COLOR,Green);
}
if(ObjectFind("lpee_bmtp2")==-1 && mtp2>0) {
ObjectCreate("lpee_bmtp2",OBJ_HLINE,0,Time[0],pLow-mtp2*Point);
ObjectSet("lpee_bmtp2",OBJPROP_COLOR,Green);
}
if(ObjectFind("lpee_bmtp3")==-1 && mtp3>0) {
ObjectCreate("lpee_bmtp3",OBJ_HLINE,0,Time[0],pLow-mtp3*Point);
ObjectSet("lpee_bmtp3",OBJPROP_COLOR,Green);
}
*/
if(cma>=pHigh && pma<=pHigh && countOrders(OP_BUY,magic)==0) {
s=s+"LONG READY\n";
if(IsTradeAllowed() && IsExpertEnabled() && open_new_orders) {
//PlaySound("alert2.wav");
if(use_tp1 && countOrders(OP_BUY,magic+1)==0) {
OrderSend(Symbol(),OP_BUY,lots,Ask,0,Bid-stop_loss*Point,ttp1,comment + " tp1",magic+1);
}
if(use_tp2 && countOrders(OP_BUY,magic+2)==0) {
OrderSend(Symbol(),OP_BUY,lots,Ask,0,Bid-stop_loss*Point,ttp2,comment + " tp2",magic+2);
}
if(use_tp3 && countOrders(OP_BUY,magic+3)==0) {
OrderSend(Symbol(),OP_BUY,lots,Ask,0,Bid-stop_loss*Point,ttp3,comment + " tp3",magic+3);
}
if(use_notp && countOrders(OP_BUY,magic+4)==0 && !just_closed(OP_BUY,magic+4)) {
OrderSend(Symbol(),OP_BUY,lots,Ask,0,Bid-stop_loss*Point,0,comment + " notp",magic+4);
}
if(mtp1>0 && countOrders(OP_BUY,magic+5)==0) {
if(((pHigh+mtp1*Point)-Ask)/Point<min_tp) {
//OrderSend(Symbol(),OP_BUY,lots,Ask,0,Bid-stop_loss*Point,Ask+min_tp*Point,comment + " mtp1",magic+5);
} else {
OrderSend(Symbol(),OP_BUY,lots,Ask,0,Bid-stop_loss*Point,pHigh+mtp1*Point,comment + " mtp1",magic+5);
}
}
if(mtp2>0 && countOrders(OP_BUY,magic+6)==0) {
if(((pHigh+mtp2*Point)-Ask)/Point<min_tp) {
//OrderSend(Symbol(),OP_BUY,lots,Ask,0,Bid-stop_loss*Point,Ask+min_tp*Point,comment + " mtp2",magic+6);
} else {
OrderSend(Symbol(),OP_BUY,lots,Ask,0,Bid-stop_loss*Point,pHigh+mtp2*Point,comment + " mtp2",magic+6);
}
}
if(mtp3>0 && countOrders(OP_BUY,magic+7)==0) {
if(((pHigh+mtp3*Point)-Ask)/Point<min_tp) {
//OrderSend(Symbol(),OP_BUY,lots,Ask,0,Bid-stop_loss*Point,Ask+min_tp*Point,comment + " mtp3",magic+7);
} else {
OrderSend(Symbol(),OP_BUY,lots,Ask,0,Bid-stop_loss*Point,pHigh+mtp3*Point,comment + " mtp3",magic+7);
}
}
}
}
if(cma<=pLow && pma>=pLow && countOrders(OP_SELL,magic)==0) {
s=s+"SHORT READY\n";
if(IsTradeAllowed() && IsExpertEnabled() && open_new_orders) {
//PlaySound("alert2.wav");
if(use_tp1 && countOrders(OP_SELL,magic+1)==0) {
OrderSend(Symbol(),OP_SELL,lots,Bid,0,Ask+stop_loss*Point,btp1,comment + " tp1",magic+1);
}
if(use_tp2 && countOrders(OP_SELL,magic+2)==0) {
OrderSend(Symbol(),OP_SELL,lots,Bid,0,Ask+stop_loss*Point,btp2,comment + " tp1",magic+2);
}
if(use_tp3 && countOrders(OP_SELL,magic+3)==0) {
OrderSend(Symbol(),OP_SELL,lots,Bid,0,Ask+stop_loss*Point,btp3,comment + " tp1",magic+3);
}
if(use_notp && countOrders(OP_SELL,magic+4)==0 && !just_closed(OP_SELL,magic+4)) {
OrderSend(Symbol(),OP_SELL,lots,Bid,0,Ask+stop_loss*Point,0,comment + " notp",magic+4);
}
if(mtp1>0 && countOrders(OP_SELL,magic+5)==0) {
if((Bid-(pLow-mtp1*Point)/Point)<min_tp) {
//OrderSend(Symbol(),OP_SELL,lots,Bid,0,Ask+stop_loss*Point,Bid-min_tp*Point,comment + " mtp1",magic+5);
} else {
OrderSend(Symbol(),OP_SELL,lots,Bid,0,Ask+stop_loss*Point,pLow-mtp1*Point,comment + " mtp1",magic+5);
}
}
if(mtp2>0 && countOrders(OP_SELL,magic+6)==0) {
if((Bid-(pLow-mtp2*Point)/Point)<min_tp) {
//OrderSend(Symbol(),OP_SELL,lots,Bid,0,Ask+stop_loss*Point,Bid-min_tp*Point,comment + " mtp2",magic+6);
} else {
OrderSend(Symbol(),OP_SELL,lots,Bid,0,Ask+stop_loss*Point,pLow-mtp2*Point,comment + " mtp2",magic+6);
}
}
if(mtp3>0 && countOrders(OP_SELL,magic+7)==0) {
if((Bid-(pLow-mtp3*Point)/Point)<min_tp) {
//OrderSend(Symbol(),OP_SELL,lots,Bid,0,Ask+stop_loss*Point,Bid-min_tp*Point,comment + " mtp3",magic+7);
} else {
OrderSend(Symbol(),OP_SELL,lots,Bid,0,Ask+stop_loss*Point,pLow-mtp3*Point,comment + " mtp3",magic+7);
}
}
}
}
} else {
s=s+"Waiting...\n";
Comment(s);
}
Comment(s);
return(0);
}
int deinit() {
ObjectDelete("lpee_high");
ObjectDelete("lpee_low");
ObjectDelete("lpee_ttp1");
ObjectDelete("lpee_ttp2");
ObjectDelete("lpee_ttp3");
ObjectDelete("lpee_btp1");
ObjectDelete("lpee_btp2");
ObjectDelete("lpee_btp3");
ObjectDelete("lpee_tmtp1");
ObjectDelete("lpee_tmtp2");
ObjectDelete("lpee_tmtp3");
ObjectDelete("lpee_bmtp1");
ObjectDelete("lpee_bmtp2");
ObjectDelete("lpee_bmtp3");
return(0);
}
int countOrders int oType, int oMagic) {
int count=0;
for(int i=0;i<OrdersTotal();i++) {
if(OrderSelect(i,SELECT_BY_POS)) {
if(OrderMagicNumber()== Magic) {
if(OrderSymbol()==Symbol()) {
if(OrderType()== Type) {
if(TimeToStr(OrderOpenTime(),TIME_DATE)==TimeToStr(TimeCurrent(),TIME_DATE)) {
count++;
}
}
}
}
}
}
return(count);
}
bool just_closed(int ot, int magic) {
for(int i=0;i<OrdersHistoryTotal();i++) {
if(OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) {
if(OrderSymbol()==Symbol()) {
if(ot==OrderType()) {
if(OrderMagicNumber()==magic) {
if(TimeLocal()-OrderCloseTime()<time_limit) {
return(true);
}
}
}
}
}
}
return(false);
}
void logarythmic_stop() {
for(int i=0;i<OrdersTotal();i++) {
if(OrderSelect(i,SELECT_BY_POS)) {
if(OrderMagicNumber()>=magic && OrderMagicNumber()<=magic+10) {
if(OrderSymbol()==Symbol()) {
int profit=0;
int sl=0;
double level=0;
bool modify=false;
if(OrderType()==OP_BUY) {
profit=(Bid-OrderOpenPrice())/Point;
if(profit>0) {
sl=log_b-MathLog(profit)/MathLog(log_a);
} else {
sl=log_b;
}
if(sl<min_sl) {
sl=min_sl;
}
level=Bid-sl*Point;
if(level>OrderStopLoss()) {
modify=true;
}
}
if(OrderType()==OP_SELL) {
profit=(OrderOpenPrice()-Ask)/Point;
if(profit>0) {
sl=log_b-MathLog(profit)/MathLog(log_a);
} else {
sl=log_b;
}
if(sl<min_sl) {
sl=min_sl;
}
level=Ask+sl*Point;
if(level<OrderStopLoss()) {
modify=true;
}
}
if(modify) {
if(!OrderModify(OrderTicket(),OrderOpenPrice(),level,OrderTakeProfit(),OrderExpiration(),CLR_NONE)) {
Print(ErrorDescription(GetLastError()));
} else {
PlaySound("stops.wav");
}
}
}
}
}
}
}
void trail() {
RefreshRates();
for(int i=0;i<OrdersTotal();i++) {
if(OrderSelect(i,SELECT_BY_POS)) {
if(OrderMagicNumber()>=magic && OrderMagicNumber()<=magic+10) {
if(OrderSymbol()==Symbol()) {
double ts;
bool trail=false;
if(OrderType()==OP_BUY) {
ts=Bid-trailing_stop*Point;
if(trail_only_on_profit) {
if(ts>=OrderOpenPrice()) {
trail=true;
}
} else {
trail=true;
}
if(trail && OrderStopLoss()>ts) {
trail=false;
}
}
if(OrderType()==OP_SELL) {
ts=Ask+trailing_stop*Point;
if(trail_only_on_profit) {
if(ts<=OrderOpenPrice()) {
trail=true;
}
} else {
trail=true;
}
if(trail && OrderStopLoss()<ts) {
trail=false;
}
}
if(trail && OrderStopLoss()!=ts) {
//Print("Trailing ",OrderSymbol(),"(",OrderTicket(),", ",OrderStopLoss(),"=>",ts,")");
//Alert("Trailing...");
if(!OrderModify(OrderTicket(),OrderOpenPrice(),ts,OrderTakeProfit(),0,0)) {
Print(ErrorDescription(GetLastError()));
} else {
PlaySound("stops.wav");
}
}
}
}
}
}
}
void secure() {
for(int i=0;i<OrdersTotal();i++) {
if(OrderSelect(i,SELECT_BY_POS)) {
if(OrderMagicNumber()>=magic && OrderMagicNumber()<=magic+10) {
if(OrderSymbol()==Symbol()) {
int profit;
bool secure=false;
double sl=0;
if(OrderType()==OP_BUY) {
profit=(Bid-OrderOpenPrice())/Point;
if(profit>=secure_profit && (profit-secure_profit)>=secure_profit_distance) {
sl=OrderOpenPrice()+secure_profit*Point;
if(sl>OrderStopLoss()) {
secure=true;
}
}
}
if(OrderType()==OP_SELL) {
profit=(OrderOpenPrice()-Ask)/Point;
if(profit>=secure_profit && (profit-secure_profit)>=secure_profit_distance) {
sl=OrderOpenPrice()-secure_profit*Point;
if(sl<OrderStopLoss()) {
secure=true;
}
}
}
if(secure) {
//Print("Securing profit on ",OrderSymbol(),"(",OrderTicket(),", ",OrderStopLoss(),"=>",sl,")");
//log("Securing profit ("+OrderTicket()+", "+DoubleToStr(OrderStopLoss(),4)+"=>"+DoubleToStr(sl,4)+")");
if(!OrderModify(OrderTicket(),OrderOpenPrice(),sl,OrderTakeProfit(),0,0)) {
Print(ErrorDescription(GetLastError()));
//log(ErrorDescription(GetLastError()));
} else {
PlaySound("stops.wav");
//Alert("Profit secured");
}
}
}
}
}
}
}
/**/