Część EA - prośba o kilka prostych linijek kodu ...

O jezykach programowania w platformach i nie tylko.
Awatar użytkownika
<kerimb>
Pasjonat
Pasjonat
Posty: 1460
Rejestracja: 27 sie 2010, 08:01

Część EA - prośba o kilka prostych linijek kodu ...

Nieprzeczytany post autor: <kerimb> »

Panowie!

Wiecie, że jestem noga z programowania więc po raz kolejny proszę o pomoc. Jeśli to będzie za dużo roboty za free, to proszę nie odpisywać. Z góry dziękuję za pomoc!

ZAŁOŻENIE GŁÓWNE
Jeśli nie da się wymusić kolejności spełniania poszczególnych warunków, to poniższy algorytm jest nieważny. Chodzi o to, że program czeka na spełnienie punktu 1, potem 2 i na koniec 3 i dopiero jeśli spełnione są wszystkie 3 ale w takiej kolejności jak napisałem, to następuje zajęcie pozycji. Istnieje możliwość spełnienia się w pierwszej kolejności punktu 3 przed 2 i wtedy algorytm nie ma sensu i praca będzie bezsensowna jeśli takiego wymuszenia kolejności spełniania warunków nie da się zrobić ...

ALGORYTM

1. Jeśli szybka Stoch'a o ustawieniach (8,5,3) jest powyżej 20
+
2. Jeśli aktualna cena jest większa o 20 pipsów od LOW poprzedniej świeczki
+
3. Jeśli aktualna cena jest większa o 20 pipsów od LOW aktualnej świeczki

to BUY

1. Jeśli szybka Stoch'a o ustawieniach (8,5,3) jest poniżej 80
+
2. Jeśli aktualna cena jest mniejsza o 20 pipsów od HIGH poprzedniej świeczki
+
3. Jeśli aktualna cena jest mniejsza o 20 pipsów od HIGH aktualnej świeczki

to SELL

3. Zlecenie tylko jedno na aktualną świeczkę
4. Zamknięcie zlecenia na zamknięciu aktualnej świeczki

P.S. Proszę się tym nie sugerować w spekulacji ponieważ jest to mały fragment opracowywanego przeze mnie EA, składanego partiami ...

Awatar użytkownika
xpep
Pasjonat
Pasjonat
Posty: 844
Rejestracja: 02 gru 2007, 11:50

Nieprzeczytany post autor: xpep »

<kerimb> pisze:P.S. Proszę się tym nie sugerować w spekulacji ponieważ jest to mały fragment opracowywanego przeze mnie EA, składanego partiami ...
jak Ty to chcesz zlozyc jak takiej prostej rzeczy nie umiesz zrobic :D

skoro te punkty sa kolejno a nie wszystko naraz spelnione to jescze brakuje w Twoim opisie uwzglednienia czasu miedzy punktami

Awatar użytkownika
<kerimb>
Pasjonat
Pasjonat
Posty: 1460
Rejestracja: 27 sie 2010, 08:01

Nieprzeczytany post autor: <kerimb> »

Nie ma znaczenia czas ... Soft sprawdza 1 ... Jeśli jest spełniony, to sprawdza 2 ... Jeśli jest spełniony to sprawdza 3 ... Dopiero jak są spełnione 1, 2 i 3 (ale tylko w takiej kolejności) zostaje odpalony sygnał na zajęcie pozycji ... Jasne, że w tym czasie kiedy będzie po spełnieniu 1 i 2 czekał na spełnienie 3, to 1 lub 2 może już nie być aktualne ... Wtedy jazda od początku ponieważ nie było sygnału na zajęcie pozycji ... itd ... itd ...

Dodano po 2 minutach:
xpep pisze:jak Ty to chcesz zlozyc jak takiej prostej rzeczy nie umiesz zrobic
Ja tego składać nie muszę ... Ktoś zrobi to za mnie ... :mrgreen:

Awatar użytkownika
w_ujek edek
Stały bywalec
Stały bywalec
Posty: 39
Rejestracja: 28 kwie 2009, 10:57

Nieprzeczytany post autor: w_ujek edek »

Kod: Zaznacz cały

if (pkt1) {
  if (pkt2) {
    if (pkt3) {
............................
}}}
mysle ze cos takiego spelnia Twoje warunki

Awatar użytkownika
<kerimb>
Pasjonat
Pasjonat
Posty: 1460
Rejestracja: 27 sie 2010, 08:01

Nieprzeczytany post autor: <kerimb> »

w_ujek edek
Mi chodzi właśnie o te pkt1; pkt2; pkt3 ... Jak to zapisać w MQLu? ... Nie idzie żadnym, ogólnie dostępnym EA Builderem ...

Awatar użytkownika
xpep
Pasjonat
Pasjonat
Posty: 844
Rejestracja: 02 gru 2007, 11:50

Nieprzeczytany post autor: xpep »

<kerimb> pisze:1. Jeśli szybka Stoch'a o ustawieniach (8,5,3) jest powyżej 20
+
2. Jeśli aktualna cena jest większa o 20 pipsów od LOW poprzedniej świeczki
+
3. Jeśli aktualna cena jest większa o 20 pipsów od LOW aktualnej świeczki

to BUY

Kod: Zaznacz cały

if(iStochastic(NULL,0,8,5,3,MODE_SMA,0,MODE_SIGNAL,0)>20) // pierwszy warunek
   if( Close[0]>(Low[1]+20*Point) )                     // drugi
      if( Close[0]>(Low[0]+20*Point) )                  // trzeci
      {  //tutaj wejscie i co tam jeszcze trzeba
      }   
<kerimb> pisze:3. Zlecenie tylko jedno na aktualną świeczkę
to chyba najpopularniejszy problem w dziale programowanie
<kerimb> pisze:4. Zamknięcie zlecenia na zamknięciu aktualnej świeczki
a to jest to wlasciwie to samo

Awatar użytkownika
Tig3r
Przyjaciel Forum
Przyjaciel Forum
Posty: 2310
Rejestracja: 02 sty 2008, 10:46

Nieprzeczytany post autor: Tig3r »

xpep
To co przedstawiasz jest błędne - chyba że wszystkie warunki mają być wykonane w obrębie 1 świecy i nadal spełnione w obrębie tej świecy - właściwie zapis określa że wszystkie warunki muszą być na raz spełnione.

Wszystko co chciałby Kerimb da się zrobić - kwestia czasu i pełniejszej koncepcji.
======================================================
Nie głupi ten co nie wie, lecz ten który nie chce się nauczyć..

Awatar użytkownika
xpep
Pasjonat
Pasjonat
Posty: 844
Rejestracja: 02 gru 2007, 11:50

Nieprzeczytany post autor: xpep »

Tig3r pisze:Wszystko co chciałby Kerimb da się zrobić - kwestia czasu i pełniejszej koncepcji.
no wlasnie tego czasu zabraklo co wczesniej pisalem i po poscie wujka edka i braku protestow kerimba doszedlem do wniosku ze jednak wszystko naraz ma byc spelnione

Awatar użytkownika
<kerimb>
Pasjonat
Pasjonat
Posty: 1460
Rejestracja: 27 sie 2010, 08:01

Nieprzeczytany post autor: <kerimb> »

Dziękuję wszystkim za pomoc jaką otrzymałem do tej pory!

Mam niestety problem z umieszczeniem właściwego warunku na zamknięcie zlecenia na otwarciu kolejnej świeczki. Nie wiem jak to rozwalić.

Wygląda to tak, że szukam spełnienia wszystkich warunków na świecy W1. Jeśli one są spełnione, to następuje zajęcie pozycji. Tutaj powinien EA po zajęciu tej pozycji trzymać ją aż do otwarcia następnej świecy na W1. Nie zależnie od tego co by się działo, to ma czekać na otwarcie kolejnej W1 albo zlecenie zdejmie SL lub ja z łapy.

Nie mogę złapać jak powiązać zamknięcie aktualnej W1 z otwarciem następnej na W1? Wszędzie jest [0] - aktualna i [1] - poprzednia. Nie ma odniesienia do następnej ... itd ... itd ...

W załączeniu, na samym końcu przesyłam fragment EA zrobiony za pomocą http://sufx.core.t3-ism.net/ExpertAdvisorBuilder/ .

Dla przykładu jako warunek wejścia dla L i S:

//+------------------------------------------------------------------+
//| Signal Begin(Entry) |
//+------------------------------------------------------------------+

Podałem z czapy Stocha, (to nie istotne)

Sygnał wyjścia powinien być w ...


//+------------------------------------------------------------------+
//| Signal Begin(Exit Buy) |
//+------------------------------------------------------------------+

dla Lki i

//+------------------------------------------------------------------+
//| Signal Begin(Exit Sell) |
//+------------------------------------------------------------------+

dla Ski ...

Czy dało by radę i czy znalazł by ktoś chwilę czasu aby zerknąć jaki warunek wwalić powyżej, tak aby po zajęciu pozycji L czy S zdejmowało tą pozycję w chwili otwarcia następnej świecy na W1? Tak i tylko tak ... Jeśli dało by radę dopisać dodatkowy warunek na to aby na danej świecy W1 było zajmowane tylko jedno zlecenie na tą świeczkę, to będę dozgonnie wdzięczny.

Z góry dzięki!

P.S. Załączam również kod edytowalny ... Można śmiało wejść na stronę http://sufx.core.t3-ism.net/ExpertAdvisorBuilder/ i załadować to ustroistwo w celu edycji ... itd .. itd ...

Pozdrawiam,
Mirek

Kod: Zaznacz cały

//+------------------------------------------------------------------+
//| This MQL is generated by Expert Advisor Builder                  |
//|                http://sufx.core.t3-ism.net/ExpertAdvisorBuilder/ |
//|                                                                  |
//|  In no event will author be liable for any damages whatsoever.   |
//|                      Use at your own risk.                       |
//|                                                                  |
//+------------------- DO NOT REMOVE THIS HEADER --------------------+

#define SIGNAL_NONE 0
#define SIGNAL_BUY   1
#define SIGNAL_SELL  2
#define SIGNAL_CLOSEBUY 3
#define SIGNAL_CLOSESELL 4

#property copyright "Expert Advisor Builder"
#property link      "http://sufx.core.t3-ism.net/ExpertAdvisorBuilder/"

extern int MagicNumber = 0;
extern bool SignalMail = False;
extern bool EachTickMode = True;
extern double Lots = 1.0;
extern int Slippage = 3;
extern bool UseStopLoss = True;
extern int StopLoss = 30;
extern bool UseTakeProfit = False;
extern int TakeProfit = 60;
extern bool UseTrailingStop = False;
extern int TrailingStop = 30;

int BarCount;
int Current;
bool TickCheck = False;
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init() {
   BarCount = Bars;

   if (EachTickMode) Current = 0; else Current = 1;

   return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit() {
   return(0);
}
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start() {
   int Order = SIGNAL_NONE;
   int Total, Ticket;
   double StopLossLevel, TakeProfitLevel;



   if (EachTickMode && Bars != BarCount) TickCheck = False;
   Total = OrdersTotal();
   Order = SIGNAL_NONE;

   //+------------------------------------------------------------------+
   //| Variable Begin                                                   |
   //+------------------------------------------------------------------+


double Buy1_1 = iStochastic("EURUSD", PERIOD_W1, 5, 3, 3, MODE_SMA, 0, MODE_MAIN, Current + 0);
double Buy1_2 = iStochastic("EURUSD", PERIOD_W1, 5, 3, 3, MODE_SMA, 0, MODE_MAIN, Current + 1);

double Sell1_1 = iStochastic("EURUSD", PERIOD_W1, 5, 3, 3, MODE_SMA, 0, MODE_MAIN, Current + 0);
double Sell1_2 = iStochastic("EURUSD", PERIOD_W1, 5, 3, 3, MODE_SMA, 0, MODE_MAIN, Current + 1);



   
   //+------------------------------------------------------------------+
   //| Variable End                                                     |
   //+------------------------------------------------------------------+

   //Check position
   bool IsTrade = False;

   for (int i = 0; i < Total; i ++) {
      OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
      if(OrderType() <= OP_SELL &&  OrderSymbol() == Symbol()) {
         IsTrade = True;
         if(OrderType() == OP_BUY) {
            //Close

            //+------------------------------------------------------------------+
            //| Signal Begin(Exit Buy)                                           |
            //+------------------------------------------------------------------+

            

            //+------------------------------------------------------------------+
            //| Signal End(Exit Buy)                                             |
            //+------------------------------------------------------------------+

            if (Order == SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
               OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen);
               if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Close Buy");
               if (!EachTickMode) BarCount = Bars;
               IsTrade = False;
               continue;
            }
            //Trailing stop
            if(UseTrailingStop && TrailingStop > 0) {                 
               if(Bid - OrderOpenPrice() > Point * TrailingStop) {
                  if(OrderStopLoss() < Bid - Point * TrailingStop) {
                     OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen);
                     if (!EachTickMode) BarCount = Bars;
                     continue;
                  }
               }
            }
         } else {
            //Close

            //+------------------------------------------------------------------+
            //| Signal Begin(Exit Sell)                                          |
            //+------------------------------------------------------------------+

            

            //+------------------------------------------------------------------+
            //| Signal End(Exit Sell)                                            |
            //+------------------------------------------------------------------+

            if (Order == SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
               OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange);
               if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Close Sell");
               if (!EachTickMode) BarCount = Bars;
               IsTrade = False;
               continue;
            }
            //Trailing stop
            if(UseTrailingStop && TrailingStop > 0) {                 
               if((OrderOpenPrice() - Ask) > (Point * TrailingStop)) {
                  if((OrderStopLoss() > (Ask + Point * TrailingStop)) || (OrderStopLoss() == 0)) {
                     OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange);
                     if (!EachTickMode) BarCount = Bars;
                     continue;
                  }
               }
            }
         }
      }
   }

   //+------------------------------------------------------------------+
   //| Signal Begin(Entry)                                              |
   //+------------------------------------------------------------------+

   if (Buy1_1 > Buy1_2) Order = SIGNAL_BUY;

   if (Sell1_1 < Sell1_2) Order = SIGNAL_SELL;


   //+------------------------------------------------------------------+
   //| Signal End                                                       |
   //+------------------------------------------------------------------+

   //Buy
   if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
      if(!IsTrade) {
         //Check free margin
         if (AccountFreeMargin() < (1000 * Lots)) {
            Print("We have no money. Free Margin = ", AccountFreeMargin());
            return(0);
         }

         if (UseStopLoss) StopLossLevel = Ask - StopLoss * Point; else StopLossLevel = 0.0;
         if (UseTakeProfit) TakeProfitLevel = Ask + TakeProfit * Point; else TakeProfitLevel = 0.0;

         Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, StopLossLevel, TakeProfitLevel, "Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);
         if(Ticket > 0) {
            if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {
				Print("BUY order opened : ", OrderOpenPrice());
                if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Open Buy");
			} else {
				Print("Error opening BUY order : ", GetLastError());
			}
         }
         if (EachTickMode) TickCheck = True;
         if (!EachTickMode) BarCount = Bars;
         return(0);
      }
   }

   //Sell
   if (Order == SIGNAL_SELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {
      if(!IsTrade) {
         //Check free margin
         if (AccountFreeMargin() < (1000 * Lots)) {
            Print("We have no money. Free Margin = ", AccountFreeMargin());
            return(0);
         }

         if (UseStopLoss) StopLossLevel = Bid + StopLoss * Point; else StopLossLevel = 0.0;
         if (UseTakeProfit) TakeProfitLevel = Bid - TakeProfit * Point; else TakeProfitLevel = 0.0;

         Ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, StopLossLevel, TakeProfitLevel, "Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);
         if(Ticket > 0) {
            if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {
				Print("SELL order opened : ", OrderOpenPrice());
                if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Open Sell");
			} else {
				Print("Error opening SELL order : ", GetLastError());
			}
         }
         if (EachTickMode) TickCheck = True;
         if (!EachTickMode) BarCount = Bars;
         return(0);
      }
   }

   if (!EachTickMode) BarCount = Bars;

   return(0);
}
//+------------------------------------------------------------------+


Dodano po 13 minutach:

Na razie z wykorzystaniem zdjęcia zlecenia na TP w 1/3 możliwego ruchu i bez optymalizacji, to wygląda tak jak na rysunku ... Zdjęcie zlecenia na otwarciu kolejnej świeczki powinno pozwolić na wzięcie dodatkowych 1/3 zakresu ruchu a nawet do 80% ... Milion testów do zrobienia i na milionach dostępnych danych ...

Oczywiście, to testy z DEMO (Wariant nr 14), bo nie da rady inaczej na tym etapie ale będzie dobrze ... :mrgreen:

Dodano po 4 minutach:
Tig3r pisze:wszystkie warunki mają być wykonane w obrębie 1 świecy i nadal spełnione w obrębie tej świecy
Dokładnie!
Tig3r pisze:wszystkie warunki muszą być na raz spełnione
Tak ale tylko w zadanej kolejności. Jeśli jako pierwszy byłby spełniony 1 a później 3, to nie ma prawa zająć pozycji ... itd ... itd ...
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.

ODPOWIEDZ