Zakonczenie pracy strategii :(

O jezykach programowania w platformach i nie tylko.
tmkk90
Stały bywalec
Stały bywalec
Posty: 50
Rejestracja: 12 lip 2010, 19:13

Zakonczenie pracy strategii :(

Nieprzeczytany post autor: tmkk90 »

Witam, mam maly problem... Mianowicie chcialbym aby po wzieciu danego TakeProfit, strategia 'wylaczyla sie' (nie otwieral juz innych pozyji)
czy jest jakas funckja ktora wywoluje zakonczenie strategii?

z gory dziekuje za odpowiedz

Michx
Stały bywalec
Stały bywalec
Posty: 41
Rejestracja: 05 lip 2010, 10:39

Nieprzeczytany post autor: Michx »

zapewne wystarczy stworzyć dodatkowy warunek przy otwieraniu pozycji. Rozumiem, że nie jesteś autorem automatu, który chcesz z fix-ować?
"Racja jest jak dupa, każdy ma swoją" J. Piłsudski

tmkk90
Stały bywalec
Stały bywalec
Posty: 50
Rejestracja: 12 lip 2010, 19:13

Nieprzeczytany post autor: tmkk90 »

Jestem, ale dopiero sie ucze wiec jest on dosc podstawowy ;) i napisany w oparciu o inne strategie... a czy moglbys mi podpowiedziec jak ten warunek powinien wygladac?


Moze napisze dokladniej o co mi chodzi:

Chcialbym zeby strategia otwierala i zamykala pozycje (w sposob jaki zapisalem w warunkach otwarcia i zamkniecia, ale gdy pozycja zamknie sie biorac dany "TakeProfit" chcialbym aby strategia automatycznie przestala dzialac i szukac nowych pozycji do otwarcia.

Michx
Stały bywalec
Stały bywalec
Posty: 41
Rejestracja: 05 lip 2010, 10:39

Nieprzeczytany post autor: Michx »

w najprostszy sposób to chyba wystarczyłoby zrobić dodatkową zmienną bool, która byłaby true a gdy dojdzie do TP to zrobiłbyś tą zmienną jako false a wcześniej zrobiłbyś coś w stylu:

Kod: Zaznacz cały

bool zmienna = true;

int start() {

if(zmienna){   //to dajesz na samym początku (a przynajmniej przed funkcją otwierającą pozycje :)
...
//reszta kodu
}
ale tak naprawdę ile programistów tyle sposobów - zależy jak komu wygodniej i jak to wszystko dokładnie ma działać.
Ostatnio zmieniony 12 lip 2010, 20:47 przez Michx, łącznie zmieniany 1 raz.
"Racja jest jak dupa, każdy ma swoją" J. Piłsudski

tmkk90
Stały bywalec
Stały bywalec
Posty: 50
Rejestracja: 12 lip 2010, 19:13

Nieprzeczytany post autor: tmkk90 »

Nadal nie chce mi dzialac.. jezeli bylbys tak mily i mial chwilke to moglbys zerknac na strategie i powiedziec mi dokladnie co i gdzie wpisac ;>

//+------------------------------------------------------------------+
//|Oblicza czy są otwarte jakieś pozycje |
//+------------------------------------------------------------------+



int CalculateCurrentOrders(string symbol)
{
int buys=0, sells=0;
for (int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break;



{
if(OrderType()==OP_BUY) buys++;
if(OrderType()==OP_SELL) sells++;

}
}
if(buys>0) return (buys);
else return (-sells);

}

//+------------------------------------------------------------------+
//| Warunki Otwarcia |
//+------------------------------------------------------------------+







void CheckForOpen()
{
double ma,ma2;
int res;
bool zmienna = true;




ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);

ma2 = iMA(NULL,0,MovingPeriod2,MovingShift2,MODE_SMA,PRICE_CLOSE,0);

if(zmienna)

if (Open[1]>ma && Close[1]<ma && ma<ma2 && ma2-ma>=MinimalnaOdlegloscSrednich*Point && ma2-ma<=MaksymalnaOdlegloscSrednich*Point)
{
res=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"",0,0,Red);
return;
}
if (Open[1]<ma && Close[1]>ma && ma>ma2 && ma-ma2>=MinimalnaOdlegloscSrednich*Point && ma-ma2<=MaksymalnaOdlegloscSrednich*Point)
{
res=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"",0,0,Blue);
return;

}
}


//+------------------------------------------------------------------+
//|Warunki zamknięcia |
//+------------------------------------------------------------------+

void CheckForClose()
{
double ma,ma2;
bool zmienna;



ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
ma2 = iMA(NULL,0,MovingPeriod2,MovingShift2,MODE_SMA,PRICE_CLOSE,0);

for(int i=0;i<OrdersTotal();i++)
{
if(OrderType()==OP_BUY)
{

if((Open[1]>ma2 && Close[1]<ma2) || (Open[1]<ma2 && Close[1]<ma2))

OrderClose(OrderTicket(),OrderLots(),Bid,3,White);

Print(OrderTakeProfit());
Print(OrderStopLoss());

break;

}

if(OrderType()==OP_SELL)
{

if((Open[1]<ma2 && Close[1]>ma2) || (Open[1]>ma2 && Close[1]>ma2))

OrderClose(OrderTicket(),OrderLots(),Ask,3,White);

Print(OrderTakeProfit());
Print(OrderStopLoss());

break;
}

}

}

//+------------------------------------------------------------------+
//| Start function |
//+------------------------------------------------------------------+
void start()

{

//---- check for history and trading
if(Bars<100 || IsTradeAllowed()==false) return;

//---- calculate open orders by current symbol

if(CalculateCurrentOrders (Symbol())==0) CheckForOpen();
else CheckForClose();


//----
}

//+------------------------------------------------------------------+

Awatar użytkownika
xamael
Gaduła
Gaduła
Posty: 108
Rejestracja: 09 cze 2009, 14:54

Nieprzeczytany post autor: xamael »

tmkk90 proszę Cie kod dajesz pomiedzy tag code.
ta zmienna

Kod: Zaznacz cały

bool zmienna = true; 
nie ma być deklarowana w funkcji ale po za nią, tj w nagłówku. Inaczej nie będzie globalna. potem tylko przed zawarciem zlecenia uzyc

Kod: Zaznacz cały

if(zmienna) { 
   OrderSend(..twojeOpcje..); 
    zmienna = false;
} else { 
    return(0); 
}
Trzymając się systemu: 82% skuteczności || Grając wbrew systemowi: 8% skuteczności. Dyscyplina jest autorem większości zwycięstw.

Michx
Stały bywalec
Stały bywalec
Posty: 41
Rejestracja: 05 lip 2010, 10:39

Nieprzeczytany post autor: Michx »

ojej :/
kilka uwag:
1. kod wrzucaj między znaczniki Code
2. zdaje się, że to co wrzuciłeś jest ciągle niepełne - czy w ogóle da się to skompilować?...
3. kod nie jest opisany - chyba nikt nie lubi zgadywać co chciałeś osiągnąć...
4. po co robisz wszystko w funkcjach?
5. Nie wiem czy Twoja wersja zawiera już (chociaż) próbę zastosowania mojego przykładu ale póki co to daleko Ci jeszcze... :/ Po pierwsze zmienna bool powinna być zadeklarowana globalnie a nie w funkcji. Po drugie jakoś nie zauważyłem zmiany tej zmiennej na false -> czy zrozumiałeś chociaż ideę tego co napisałem?

Kod jest zbyt mało czytelny żeby w ogóle go przeglądać a co dopiero poprawiać - chyba łatwiej byłoby to stworzyć od nowa :/

aha i jeszcze mała wskazówka: jak chcesz zastosować mój przykład musisz również stwierdzić kiedy Twój EA osiągnie TP - czy wziąłeś to pod uwagę?
"Racja jest jak dupa, każdy ma swoją" J. Piłsudski

tmkk90
Stały bywalec
Stały bywalec
Posty: 50
Rejestracja: 12 lip 2010, 19:13

Nieprzeczytany post autor: tmkk90 »

Tutaj juz caly kod, staralem sie umiescic na nim wasze wskazowki:

Kod: Zaznacz cały

extern double Lots               = 0.1;


extern double MovingPeriod       = 25;
extern double MovingShift        = 0;


extern double MovingPeriod2      = 50;
extern double MovingShift2       = 15;


extern double TakeProfit         = 30;
extern double StopLoss           = 30;

extern double MinimalnaOdlegloscSrednich  = 20;
extern double MaksymalnaOdlegloscSrednich = 30;

bool zmienna = true;


//+------------------------------------------------------------------+
//|Oblicza czy są otwarte jakieś pozycje                             |
//+------------------------------------------------------------------+



int CalculateCurrentOrders(string symbol)
{
int buys=0, sells=0;
for (int i=0;i<OrdersTotal();i++)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==false) break; 
{
if(OrderType()==OP_BUY) buys++;
if(OrderType()==OP_SELL) sells++;
}
}
if(buys>0) return (buys);
else return (-sells);

}
 
//+------------------------------------------------------------------+
//| Warunki Otwarcia                                                 |
//+------------------------------------------------------------------+
void CheckForOpen()
{
double ma,ma2;
int res;


ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
ma2 = iMA(NULL,0,MovingPeriod2,MovingShift2,MODE_SMA,PRICE_CLOSE,0);

if (zmienna)
{
if (Open[1]>ma && Close[1]<ma && ma<ma2 && ma2-ma>=MinimalnaOdlegloscSrednich*Point && ma2-ma<=MaksymalnaOdlegloscSrednich*Point)
{
res=OrderSend(Symbol(),OP_SELL,Lots,Bid,3,Bid+StopLoss*Point,Bid-TakeProfit*Point,"",0,0,Red);
}
if (Open[1]<ma && Close[1]>ma && ma>ma2 && ma-ma2>=MinimalnaOdlegloscSrednich*Point && ma-ma2<=MaksymalnaOdlegloscSrednich*Point)
{
res=OrderSend(Symbol(),OP_BUY,Lots,Ask,3,Ask-StopLoss*Point,Ask+TakeProfit*Point,"",0,0,Blue);
}
} 
else 
{
return(0);
}
}
//+------------------------------------------------------------------+
//|Warunki zamknięcia                                                |
//+------------------------------------------------------------------+

void CheckForClose()
{
double ma,ma2;
bool zmienna;

ma=iMA(NULL,0,MovingPeriod,MovingShift,MODE_SMA,PRICE_CLOSE,0);
ma2 = iMA(NULL,0,MovingPeriod2,MovingShift2,MODE_SMA,PRICE_CLOSE,0);

for(int i=0;i<OrdersTotal();i++)
     {
       if(OrderType()==OP_BUY)
        {
        if((Open[1]>ma2 && Close[1]<ma2) || (Open[1]<ma2 && Close[1]<ma2))
         OrderClose(OrderTicket(),OrderLots(),Bid,3,White);
         Print(OrderTakeProfit());
         Print(OrderStopLoss());
         break;  
        }
       
      if(OrderType()==OP_SELL)
        {
       if((Open[1]<ma2 && Close[1]>ma2) || (Open[1]>ma2 && Close[1]>ma2)) 
         OrderClose(OrderTicket(),OrderLots(),Ask,3,White);
         Print(OrderTakeProfit());
         Print(OrderStopLoss());   
         break;
        }
      }
    if(OrderProfit()>= TakeProfit)zmienna=false;  // tutaj mialo byc to ze po wzieciu takeprofit zmienna przybiera wartosc false (czy tak to ma wygladac?)
    }
    
//+------------------------------------------------------------------+
//| Start function                                                   |
//+------------------------------------------------------------------+
void start()

{
//---- check for history and trading
   if(Bars<100 || IsTradeAllowed()==false) return;

//---- calculate open orders by current symbol
   if(CalculateCurrentOrders (Symbol())==0) CheckForOpen();
   else                                    CheckForClose();

//----
}

//+------------------------------------------------------------------+

Michx
Stały bywalec
Stały bywalec
Posty: 41
Rejestracja: 05 lip 2010, 10:39

Nieprzeczytany post autor: Michx »

Idziesz w dobrą stronę ale sprawdź co zwraca funkcja OrderProfit()? (czy rzeczywiście pipsy?) i czy rzeczywiście powinieneś porównywać to do zmiennej bez mnożenia przez Point :) <- piszę trochę jakby to miała być zagadka :P Aha i bardziej pasowałby tam znak równości a nie większy lub równy (większy nie powinien być bo zrealizuje się TP) :)
Wydaje mi się, że lepiej, gdybyś użył funkcji: OrderOpenPrice() i OrderClosePrice().
Sprawdź jak one działają!
Porównując te dwie ceny możesz ocenić czy został zrealizowany TP - tylko trzeba uważać bo mamy dwie ceny: BID i ASK! Do tego cena zamknie się o jeden pips za wcześnie i wszystko szlag trafi...
Dlatego zastanawiam się czy nie lepiej byłoby, gdybyś zrezygnował z tradycyjnego TP i wrzucił warunek, który zamknąłby pozycję po odpowiednio dużej różnicy między Bid/Ask a OrderOpenPrice() i przy okazji zmieniłbyś zmienną na false.
Aha i może zmień nazwę tej zmiennej np. na bool Stop (nazwa "zmienna" to był taki przykład, który teraz jest bardzo niewygodny :P)
"Racja jest jak dupa, każdy ma swoją" J. Piłsudski

tmkk90
Stały bywalec
Stały bywalec
Posty: 50
Rejestracja: 12 lip 2010, 19:13

Nieprzeczytany post autor: tmkk90 »

Wielkie dzieki za pomoc, jutro postaram sie poprawic strategie kierujac sie Twoimi wskazowakami :) i dam znac jak mi poszlo

Dodano po 11 godzinach 16 minutach:

Wydaje mi sie, ze dziala tak jak tego chcialem (musze jeszcze dokladnie sprawdzic) :) MichX, xamael wielkie dzieki :)

ODPOWIEDZ