Jak dopisać warunek.

O jezykach programowania w platformach i nie tylko.
stacyjka
Bywalec
Bywalec
Posty: 16
Rejestracja: 28 mar 2013, 15:36

Jak dopisać warunek.

Nieprzeczytany post autor: stacyjka »

Witam.,
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");
      }
     }
     
    } 
   }
  }
 }
}
/**/

z6yszko
Gaduła
Gaduła
Posty: 266
Rejestracja: 17 sty 2011, 10:09

Re: Jak dopisać warunek.

Nieprzeczytany post autor: z6yszko »

Coś kompletnie namieszane w tym kodzie jest. Pełno błędów.
Generalnie do zamykania możesz użyć następującej funkcji:

Kod: Zaznacz cały

bool CloseSelected(int sw) {
	bool closed = true;
	double profit = 0;
	int type;

	for(int i = OrdersTotal()-1; i >= 0; i--) {
        OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
        if(Symbol() == OrderSymbol()) {
            type = OrderType();
            bool result = false;
            if (type == OP_BUY && sw == 1) {
            	result = OrderClose( OrderTicket(), OrderLots(), Bid, 0, Orange );
            } else if (type == OP_SELL && sw == -1) {
            	result = OrderClose( OrderTicket(), OrderLots(), Ask, 0, Orange );
            }

            if(result == false)
            {
              closed = false;
              Print ("Failed to close order, error # ", GetLastError());
            }
        }
    }
    return(closed);
}
Wywołanie z parametrem:
CloseSelected(1); //--- Zamyka wszystkie longi
CloseSelected(-1); //--- Zamyka wszystkie shorty

stacyjka
Bywalec
Bywalec
Posty: 16
Rejestracja: 28 mar 2013, 15:36

Re: Jak dopisać warunek.

Nieprzeczytany post autor: stacyjka »

Witam.
Na wstępie dziękuję za pomoc.
Tylko gdzie wkleić ten kod ? Próbowałem wklejać ale to na nic. Cały kod wtedy nie działa. Czy mogę prosić o skomponowanie tego w całość.

z6yszko
Gaduła
Gaduła
Posty: 266
Rejestracja: 17 sty 2011, 10:09

Re: Jak dopisać warunek.

Nieprzeczytany post autor: z6yszko »

stacyjka pisze:Witam.
Na wstępie dziękuję za pomoc.
Tylko gdzie wkleić ten kod ? Próbowałem wklejać ale to na nic. Cały kod wtedy nie działa. Czy mogę prosić o skomponowanie tego w całość.
Zapomniałeś dodać, że bez wklejenia moich funkcji kod też nie działa. Tak jak napisałem wcześniej - po prostu kompletnie skopane to jest. Jakbym chciał poprawiać, to musiałbym napisać od nowa.

ODPOWIEDZ