Zamiast jednej dwie transakcje na świece EA

O jezykach programowania w platformach i nie tylko.
ebate
Stały bywalec
Stały bywalec
Posty: 24
Rejestracja: 18 mar 2012, 21:06

Zamiast jednej dwie transakcje na świece EA

Nieprzeczytany post autor: ebate »

Witam,
Tworze EA opartym na zmiennych pobieranych z danych otwarcia świec, zamkniecia itp. Na podstawie tych zmiennych określam warunki do otwarcia/zamknięcia transakcji. Mam do dyspozycji następującego EA:

Kod: Zaznacz cały

//+--------------------------------------------------+
//|              ***** Parametry *****                   |
//+--------------------------------------------------+

int MagicNumber = 847349;                 
extern double Lots = 0.5;
int blokada=0;      
///////////////////////////////////////////
void init()
{}
/////////////////////////////////////////////////////////
void deinit()
{}
//////////////////////////////////////////////////////
void start() 
{
 
   /////ZMIENNE/////   

   if(blokada==1&&isNewBar())blokada=0;
   
   if(blokada==0&&WarunkiOtwarciaBuy){send(OP_BUY);blokada=1;}
   if(blokada==0&&WarunkiOtwarciaSell){send(OP_SELL);blokada=1;}

   if (total(OP_BUY)>0&&WarunkiZamknieciaBuy)ZamknijBuy();
   if (total(OP_SELL)>0&&WarunkiZamknięciaSell)ZamknijSell();
}
////////////////////////////////////////////////////
int total(int cmd)
{
   int sum=0;
   for ( int i=0;i<=OrdersTotal();i++)
   {
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if (OrderSymbol()==Symbol() && cmd ==OrderType() && MagicNumber==OrderMagicNumber()) sum++;
   }
   return(sum);
}
///////////////////////////////////////////////////////
void send(int cmd)
{
   double pr;
   color cl;
   if (cmd==OP_BUY)
   {
      pr = Ask;
      cl = Blue;
   }
   if (cmd==OP_SELL)
   {
      pr = Bid;
      cl = Red;
   }
   int ticket = OrderSend(Symbol(),cmd,Lots,pr,0,0,0,"",MagicNumber,0,cl);
}
///////////////////////////////////////////////////
void ZamknijBuy()
{     
   int i;
   
   for (i = 0; i < OrdersTotal(); i++)
   {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
      {
         if (OrderType() == OP_BUY)
         { 
         OrderClose(OrderTicket(), OrderLots(), Bid,2, Aqua);
         }
      }
   }
} 

void ZamknijSell()
{     
   int i;
   
   for (i = 0; i < OrdersTotal(); i++)
   {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
      {
         if (OrderType() == OP_SELL)
         { 
         OrderClose(OrderTicket(), OrderLots(), Ask,2, Magenta);
         } 
      }
   }
}
///////////////////////////////////////////////////////////////////////////////   
bool isNewBar() 
{
   static int prevTime;
   bool newBar=false;
   if(Time[0]!=prevTime)
   {
      newBar=true;
      prevTime=Time[0];
   }
   return(newBar);
}
Problem polega na tym, że dodając jakiś przykładowy warunek ea otwiera mi dwie lub więcej transakcji na jedną świece. Założyłem blokadę, lecz nic to nie dało. Dodam, iż warunki otwarcia sell mają być warunkami zamknięcia buy oraz warunki otwarcia buy mają być warunkami zamknięcia sell. Z grubsza wygląda to tak: otwierają się pozycje buy (jedna na świece, lecz może być kilka sąsiadujących), ale kiedy zostają spełnione warunki otwarcia sell, wszystkie buy są zamykane i otwierana jest pozycja sell, itd.

green7
Maniak
Maniak
Posty: 2060
Rejestracja: 16 sty 2008, 18:44

Re: Zamiast jednej dwie transakcje na świece EA

Nieprzeczytany post autor: green7 »

A po co Ci ta blokada (znaczy zmienna o tej nazwie) ?
Kombinujesz z nią jak koń pod górę ....

Nie prościej i czytelniej byłoby napisać to w stylu:

Kod: Zaznacz cały

if (IsNewBar())
{
  if (BuySignal())
  {
    SendBuyOrder();
  }
  ....
}
Green
Obrazek
Obrazek

ebate
Stały bywalec
Stały bywalec
Posty: 24
Rejestracja: 18 mar 2012, 21:06

Re: Zamiast jednej dwie transakcje na świece EA

Nieprzeczytany post autor: ebate »

Przerobiłem kod ale teraz nie zamyka wszystkich transakcji sell(buy) na sygnale buy(sell), tylko jedna, i nastepna na nastepnym sygnale itd., czyli jedna operacja na jeden sygnał

Kod: Zaznacz cały

void init(){
}
//////////////////////////////////////////////////////
void deinit(){
}
//////////////////////////////////////////////////////
void start(){

   /////ZMIENNE/////
   
   if(IsNewBar()){   
      if(WARUNKI){
         BuySignal();
         CloseSell();
      }
      if(WARUNKI){
         SellSignal();
         CloseBuy();
      }
   }
}
//////////////////////////////////////////////////////
void BuySignal(){
   double Lots = AccountBalance()*0.0001;
   OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,0,"",MagicNumber,0,Green);
}
//////////////////////////////////////////////////////
void CloseBuy(){
   if(total(OP_BUY)>0){
      int i;   
      for (i = 0; i < OrdersTotal(); i++){
         OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber){
            if (OrderType() == OP_BUY){ 
            OrderClose(OrderTicket(), OrderLots(), Bid,0, Green);
            }
         }
      }
   }
}
/////////////////////////////////////////////////////
void SellSignal(){
   double Lots = AccountBalance()*0.0001;
   OrderSend(Symbol(),OP_SELL,Lots,Bid,0,0,0,"",MagicNumber,0,Red);
}
//////////////////////////////////////////////////////
void CloseSell(){   
   if(total(OP_SELL)>0){  
      int i;   
      for (i = 0; i < OrdersTotal(); i++){
         OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
         if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber){
            if (OrderType() == OP_SELL){ 
            OrderClose(OrderTicket(), OrderLots(), Ask,0, Red);
            } 
         }
      }
   }
}
//////////////////////////////////////////////////////
int total(int cmd)
{
   int sum=0;
   for ( int i=0;i<=OrdersTotal();i++)
   {
      OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
      if (OrderSymbol()==Symbol() && cmd ==OrderType() && MagicNumber==OrderMagicNumber()) sum++;
   }
   return(sum);
}
////////////////////////////////////////////////////// 
bool IsNewBar(){
   static int prevTime;
   bool newBar=false;
   if(Time[0]!=prevTime)
   {
      newBar=true;
      prevTime=Time[0];
   }
   return(newBar);
}

ebate
Stały bywalec
Stały bywalec
Posty: 24
Rejestracja: 18 mar 2012, 21:06

Re: Zamiast jednej dwie transakcje na świece EA

Nieprzeczytany post autor: ebate »

Wstawiam kod, może się komuś przyda. EA działa zgodnie z w/w założeniami.

Kod: Zaznacz cały

int MagicNumber = 847349;
double Lots = 0.01;
//////////////////////////////////////////////////////
void init(){
}
//////////////////////////////////////////////////////
void deinit(){
}
//////////////////////////////////////////////////////
void start(){
  
   //Zmienne

   if(IsNewBar()){     
                
      if(Warunek1){   
         for (int i=OrdersTotal()-1; i>=0; i--){
            if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
               if (OrderType() == OP_SELL){ 
                  OrderClose(OrderTicket(),OrderLots(),Ask,0,Green);
               }
            }
         }
      }            
      if(Warunek2){   
         for (i=OrdersTotal()-1; i>=0; i--){
            if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)){
               if (OrderType() == OP_BUY){ 
                  OrderClose(OrderTicket(),OrderLots(),Bid,0,Green);
               }
            }
         }
      }   
      if(Warunek1){         
         OrderSend(Symbol(),OP_BUY,Lots,Ask,0,0,0,NULL,MagicNumber,0,Green);
      }
      if(Warunek2){         
         OrderSend(Symbol(),OP_SELL,Lots,Bid,0,0,0,NULL,MagicNumber,0,Red);
      }
   }
}
//////////////////////////////////////////////////////
bool IsNewBar(){
   static int prevTime;
   bool newBar=false;
   if(Time[0]!=prevTime){
      newBar=true;
      prevTime=Time[0];
   }
   return(newBar);
}
//////////////////////////////////////////////////////

ODPOWIEDZ