Zakonczenie pracy strategii :(
Zakonczenie pracy strategii :(
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
czy jest jakas funckja ktora wywoluje zakonczenie strategii?
z gory dziekuje za odpowiedz
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.

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.
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:
ale tak naprawdę ile programistów tyle sposobów - zależy jak komu wygodniej i jak to wszystko dokładnie ma działać.
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
}
Ostatnio zmieniony 12 lip 2010, 20:47 przez Michx, łącznie zmieniany 1 raz.
"Racja jest jak dupa, każdy ma swoją" J. Piłsudski
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();
//----
}
//+------------------------------------------------------------------+
//+------------------------------------------------------------------+
//|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();
//----
}
//+------------------------------------------------------------------+
tmkk90 proszę Cie kod dajesz pomiedzy tag code.
ta zmienna
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
ta zmienna
Kod: Zaznacz cały
bool zmienna = true;
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.
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ę?

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...


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
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();
//----
}
//+------------------------------------------------------------------+
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
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
)




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

"Racja jest jak dupa, każdy ma swoją" J. Piłsudski