Poszukuję kogoś kto zrobił by dla mnie prosty automat

O jezykach programowania w platformach i nie tylko.
Zlepek
Bywalec
Bywalec
Posty: 16
Rejestracja: 30 sie 2018, 09:00

Re: Poszukuję kogoś kto zrobił by dla mnie prosty automat

Nieprzeczytany post autor: Zlepek »

Dzięki. Będę szukał w sieci. Problem polega w tym że nie znam komend języka mql4. Logicznie wiem jak to trzeba by było zrobić. Problem jest tylko z komendami. Przynajmniej tak mi się wydaje. Jak ładnie to rozpiszę wrzucisz jakieś komendy ? Np. Wiem że musiał bym dodać zmienną = cena otwarcia pozycji. Następnie ją zapisać gdy otwiera mi się pozycja. I teraz podejrzewam że w
void OnTick()
{
//---
MqlTick lastTick;

if (Hour() ==18 && Minute()== 00 ) {
// open order
if(SymbolInfoTick(Symbol(),lastTick)) {
//Print( lastTick.bid );
if (lastTick.bid > iOpen(Symbol(), PERIOD_H1, 9)) {
sendBuyOrder();
} else {
sendSellOrder();
}
}

}
if (Hour() == 23 && Minute() == 57) {
// close order
manuallyCloseOrder();
}


//Print( iOpen(Symbol(), PERIOD_D1, 1) );
//Print( iLow(Symbol(), PERIOD_D1, 1) );
//Print( iHigh(Symbol(), PERIOD_D1, 1) );


}
Czyli tu przed

Kod: Zaznacz cały

if (Hour() == 23 && Minute() == 57) {
         // close order
         manuallyCloseOrder();
wstawić moją pętle odpowiedzialną za przesunięcie sl. I wpisać

Kod: Zaznacz cały

if buy 
        if cena otwarcia == cena otwarcia + 60 then 
      sl = cena otwarcia + 40

I analogicznie do selorder. Z drugiej jednak strony widzę w kodzie że odpowiedzialnym za ustawienia sl i tp jest ChartEvent function bo to tu jest obliczany sl i tp. Więc totalnie zgłupiałem. Ale się nie poddaje szukam komend od rana :)
Wiem też że jest sporo gotowych skrypt SL i BE więc teoretycznie mógł bym usunąć tu SL i TP i dodać do Automatu skrypt BE i SL . Ale nie o to mi chodzi.

No i -rookie- Muszę Cię pochwalić bo stworzyłeś EA które od 01.01.2018 zarabia więc moje gratulacje :) Teraz kwestia optymalizacji i tego nieszczęsnego przesuwanego SL które znacząco podniosło by zyskowność :)

-rookie-
Maniak
Maniak
Posty: 2307
Rejestracja: 13 kwie 2015, 19:00

Re: Poszukuję kogoś kto zrobił by dla mnie prosty automat

Nieprzeczytany post autor: -rookie- »

Nawet nie kiwnąłeś palcem żeby zajrzeć w dokumentacje. Ok, zadanie...

Kod: Zaznacz cały

//+------------------------------------------------------------------+
//|                                       testTEestttttt92938123.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   OrderSend(Symbol(), OP_BUY, 0.01, Ask, 3, 0, 0,"pozycja 1 - buy", 123456, 0, clrGreen);
   OrderSend(Symbol(), OP_SELL, 0.01, Bid, 3, 0, 0,"pozycja 2 - sell", 123456, 0, clrRed);
   OrderSend(Symbol(), OP_SELL, 0.02, Bid, 3, 0, 0,"pozycja 3 - sell", 123456, 0, clrRed);
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
      testowaFunkcja();
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) {}
//+------------------------------------------------------------------+

void testowaFunkcja() {
   for(int i=OrdersTotal(); i>=0; i--) {
      if(OrderSelect(i, SELECT_BY_POS)==true) {
         // wyswietl informacje o pozycjach
         Print( " profit " + i + " " + OrderType() + " " + OrderProfit() );
         
         // sprawdz zysk 
         if (OrderProfit() >= 10) {
            Print( " zysk " + i + " jest wiekszy lub rowny 10 " + OrderProfit() );
         } else {
            Print( " zysk tych pozycji " + i + "  jest mniejszy od 10 " + OrderProfit() );
         }
         
         // sprawdz odleglosc w pipsach
         if (OrderType() == 0) {
            // BUY order type
            Print( " dystans w pipsach od ceny OPEN do BID dla pozycji " + i + " --> " + NormalizeDouble(((Bid - OrderOpenPrice()) * getSymbolScale()), 2) );
         } else if (OrderType() == 1) {
            // SELL order type
            Print( " dystans w pipsach od ceny ASK do OPEN dla pozycji " + i + " --> " + NormalizeDouble(((OrderOpenPrice() - Ask) * getSymbolScale()), 2) );
         }
         
      }
   }
}

double getSymbolScale() {
   double res = 0;
   if (Point == 0.00001) { // EURUSD, GBPUSD etc
      res = 10000; // ok
   } else if (Point == 0.001) { // USDJPPY etc
      res = 1000; // ?? do sprawdzenia
   } else if (Point == 0.01) { // DAX
      res = 10; // ?? do sprawdzenia
   }
   return res;
}
Masz tutaj przykład jak policzyć odległość w pipsach od ceny otwarcia do aktualnej ceny Bid lub Ask w zależności czy jest otwarta pozycja SELL lub BUY. Zadanie polega na zrobieniu instrukcji warunkowej if tak żeby po osiągnięciu zysku większego lub równego 20 od ceny otwarcia dla dowolnego kierunku pozycji, czyli jeśli cena pójdzie w gore lub w dol 20 pipsów na plus wtedy w tej instrukcji masz policzyć odległość 10 pipsów o ceny otwarcia, masz zwrócić kurs instrumentu na którym po przekroczeniu 20 pipsów w strone zysku postawisz Stop Loss. Jak uzyskać cene 10 pipsów dalej od otwarcia po przekroczeniu 20 pips zysku? Podpowiem że masz już coś podobnego w tym kodzie double stoploss = NormalizeDouble(Bid-minstoplevel_SL*Point,Digits); co zwraca właśnie wartość dla SL, tylko masz policzyć teraz jak to zrobić po przekroczeniu 20 pipsów... https://images90.fotosik.pl/29/438ff629fd3c9909.png

Zlepek
Bywalec
Bywalec
Posty: 16
Rejestracja: 30 sie 2018, 09:00

Re: Poszukuję kogoś kto zrobił by dla mnie prosty automat

Nieprzeczytany post autor: Zlepek »

Kod: Zaznacz cały

         if (OrderType() == 0) {//warunek jeśli jest buy
                 double minstoplevel_SL = MarketInfo(Symbol(),MODE_STOPLEVEL)+SL_POINT*10;
                 double stoploss = NormalizeDouble(Bid-minstoplevel_SL*Point,Digits);  //skopoiwane ze stałego sl
                    } else   if NormalizeDouble(((Bid - OrderOpenPrice()+(OrderProfit() >= 20)
                 double minstoplevel_SL = OrderOpenPrice()+(OrderProfit() +10
                 double stoploss = NormalizeDouble(
                  
Jeśli to wszystko jest bez sensu to nie mam pojęcia co więcej wymyślić

-rookie-
Maniak
Maniak
Posty: 2307
Rejestracja: 13 kwie 2015, 19:00

Re: Poszukuję kogoś kto zrobił by dla mnie prosty automat

Nieprzeczytany post autor: -rookie- »

Zlepek pisze:

Kod: Zaznacz cały

         if (OrderType() == 0) {//warunek jeśli jest buy
                 double minstoplevel_SL = MarketInfo(Symbol(),MODE_STOPLEVEL)+SL_POINT*10;
                 double stoploss = NormalizeDouble(Bid-minstoplevel_SL*Point,Digits);  //skopoiwane ze stałego sl
                    } else   if NormalizeDouble(((Bid - OrderOpenPrice()+(OrderProfit() >= 20)
                 double minstoplevel_SL = OrderOpenPrice()+(OrderProfit() +10
                 double stoploss = NormalizeDouble(
                  
Jeśli to wszystko jest bez sensu to nie mam pojęcia co więcej wymyślić
Po tym stwierdzeniu i tym kodzie wiem że nawet nie wpisałeś tego do edytora i nie skompilowałeś bo inaczej dostałbyś błąd. Już nie mówiąc o sprawdzeniu co to zwróciło. Gdybyś pofatygował się żeby to rozwiązać rozumiałbyś to co teraz wkleje tutaj. Ok, to co wrzucam to jest tylko wersja testowa sprawdzana na EURUSD! Skoro jesteś leniwy to ja tak samo nie będę się fatygował dalej żeby dokończyć ten kod lub go przerabiać. Za błędy w kodzie nie odpowiadam.

Wersja z ustawieniem SL po przekroczeniu 60 pisów na +40 pips jako zabezpieczenie zysku, czyli to co chciałeś. Do tego zamykanie pozycji o 23:50.

Kod: Zaznacz cały

//+------------------------------------------------------------------+
//|                                     EATime31082018_BetaTest2.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern int MagicNumber = 100;
extern int Slippage = 3;
extern double LotSize = 0.1;
int counter = 0;

extern int SL_POINT = 10;
extern int TP_POINT = 500;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
      MqlTick lastTick;
     
      /*
      if (Hour() > 7 && Hour() < 9) {
         // open order
         if(SymbolInfoTick(Symbol(),lastTick)) {
            //Print( lastTick.bid );
            if (lastTick.bid > iClose(Symbol(), PERIOD_D1, 1)) {
               sendBuyOrder();
            } else {
               sendSellOrder();
            }
         }
         
      }
      */
     
      if (Hour() == 18 && Minute() == 0) {
         // open order
         if(SymbolInfoTick(Symbol(),lastTick)) {
            //Print( lastTick.bid );
            if (lastTick.bid > iClose(Symbol(), PERIOD_H1, 3)) {
               //Print( iClose(Symbol(), PERIOD_H1, 3) );
               double sl_price = iClose(Symbol(), PERIOD_H1, 3);
               sendBuyOrder(sl_price);
            } else {
               //Print( iClose(Symbol(), PERIOD_H1, 3) );
               double sl_price = iClose(Symbol(), PERIOD_H1, 3);
               sendSellOrder(sl_price);             
            }
         }
         
      }
     
      if (Hour() == 23 && Minute() == 50) {
         // close order
         manuallyCloseOrder();
      }
   
      //Print( iOpen(Symbol(), PERIOD_D1, 1) );
      //Print( iLow(Symbol(), PERIOD_D1, 1) );
      //Print( iHigh(Symbol(), PERIOD_D1, 1) );
     
      //Print( "test" );
      
      trackOrderPL();
      
      //trailingStop();
      
      //Print( " check point " + Point );
     
   
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) {}
//+------------------------------------------------------------------+

/*
void sendBuyOrder() {
   if (OrdersTotal() > 0) return;
   double minstoplevel_SL = MarketInfo(Symbol(),MODE_STOPLEVEL)+SL_POINT*10;
   double minstoplevel_TP = MarketInfo(Symbol(),MODE_STOPLEVEL)+TP_POINT*10;
   double stoploss = NormalizeDouble(Bid-minstoplevel_SL*Point,Digits);
   double takeprofit = NormalizeDouble(Bid+minstoplevel_TP*Point,Digits);
   OrderSend(Symbol(), OP_BUY, LotSize, Ask, Slippage, stoploss, takeprofit,"Buy[" + counter +"]", MagicNumber, 0, clrGreen);
   counter++;
}

void sendSellOrder() {
   if (OrdersTotal() > 0) return;
   double minstoplevel_SL = MarketInfo(Symbol(),MODE_STOPLEVEL)+SL_POINT*10;
   double minstoplevel_TP = MarketInfo(Symbol(),MODE_STOPLEVEL)+TP_POINT*10;
   double stoploss = NormalizeDouble(Ask+minstoplevel_SL*Point,Digits);
   double takeprofit = NormalizeDouble(Ask-minstoplevel_TP*Point,Digits);
   OrderSend(Symbol(), OP_SELL, LotSize, Bid, Slippage, stoploss, takeprofit,"Sell[" + counter +"]", MagicNumber, 0, clrRed);
   counter++;
}
*/

void sendBuyOrder(double sl_price) {
   if (OrdersTotal() > 0) return;
   double minstoplevel_TP = MarketInfo(Symbol(),MODE_STOPLEVEL)+TP_POINT*10;
   double takeprofit = NormalizeDouble(Bid+minstoplevel_TP*Point,Digits);
   OrderSend(Symbol(), OP_BUY, LotSize, Ask, Slippage, sl_price, takeprofit,"Buy[" + counter +"]", MagicNumber, 0, clrGreen);
   counter++;
}

void sendSellOrder(double sl_price) {
   if (OrdersTotal() > 0) return;
   double minstoplevel_TP = MarketInfo(Symbol(),MODE_STOPLEVEL)+TP_POINT*10;
   double takeprofit = NormalizeDouble(Ask-minstoplevel_TP*Point,Digits);
   OrderSend(Symbol(), OP_SELL, LotSize, Bid, Slippage, sl_price, takeprofit,"Sell[" + counter +"]", MagicNumber, 0, clrRed);
   counter++;
}

void manuallyCloseOrder() {
   for(int i=OrdersTotal(); i>=0; i--) {
      if(OrderSelect(i, SELECT_BY_POS)==true) {
         if (OrderType() == 0) {
            OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 0, clrNONE);
         } else if (OrderType() == 1) {
            OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 0, clrNONE);
         }
      }
   }
}

/*
 * Wersja z konkretnymi wartościami w 2 krokach, 
 * najpierw SL przesuwa na 40 pips zysku po przekroczeniu 60 pips
 * za drugim razem po przekroczeniu 100 pips przesuwa na 80 pisp zysku
 * Można do tego użyć TP na przykład 200 pips
 */
void trackOrderPL() {

   for(int i=OrdersTotal(); i>=0; i--) {
      if(OrderSelect(i, SELECT_BY_POS)==true) {
         //Print( OrderProfit() ); 
         if (OrderType() == 0) {        
            // zabezpiecz zysk po 60 pipsch
            if (NormalizeDouble(((Bid - OrderOpenPrice()) * getSymbolScale()), 2) > 60) {
               double new_sl = NormalizeDouble(OrderOpenPrice()+(MarketInfo(Symbol(),MODE_STOPLEVEL)+400)*Point,Digits);
            //Print( " 0 " + new_sl ); 
            OrderModify(OrderTicket(), OrderOpenPrice(), new_sl, OrderTakeProfit(), 0, clrNONE);
            }
         } else if (OrderType() == 1) {
            // zabezpiecz zysk po 60 pispch
            if (NormalizeDouble(((OrderOpenPrice() - Ask) * getSymbolScale()), 2) > 60) {
               double new_sl = NormalizeDouble(OrderOpenPrice()-(MarketInfo(Symbol(),MODE_STOPLEVEL)+400)*Point,Digits); 
               //Print( "1 " + new_sl ); 
               OrderModify(OrderTicket(), OrderOpenPrice(), new_sl, OrderTakeProfit(), 0, clrNONE);
            }
         }         
      }
   }
}

int startTS = 20;
int TS = 10;
int step = 20;
//****************************//
// WERSJA TESTOWANA DLA EURUSD 
// Mnożnik 10000
// Dla indeksu DAX będzie to chyba 1
// Dla USDJPY chyba będzie to 100
// Trzeba zrobic funkcje ktora bedzie zwracala jeden z tych 3 wariantow w zaleznosci od skalowania Symbol() 
// Ponieawż DAX ma 5 cyfr przed przecinkiem, z koleii EURUSD tylko 1, a USDJPY 3 cyfry.
// Najprosciej zrobic funkcje ktora bedzie to sprawdzac
// OK, tutaj jest dodana funckja getSymbolScale() ktora zwraca Point dla danego instrument - zdefiniowane sa 3 typy
//****************************//
void trailingStop() {
   for(int i=OrdersTotal(); i>=0; i--) {
      if(OrderSelect(i, SELECT_BY_POS)==true) {
         if (OrderType() == 0) {
            double n = NormalizeDouble((Ask - OrderOpenPrice()) * 10000, 2);  // zamiast 10000 daj getSymbolScale()
            //Print( n );
            double m = NormalizeDouble((Ask - OrderStopLoss()) * 10000, 2); // zamiast 10000 daj getSymbolScale()
            //Print( " m " + m ); 
            if (NormalizeDouble(((Bid - OrderOpenPrice()) * getSymbolScale()), 2) > startTS) {
               if (m > step) {
                  double new_sl = NormalizeDouble(OrderStopLoss()+(MarketInfo(Symbol(),MODE_STOPLEVEL)+TS*10)*Point,Digits);
                  OrderModify(OrderTicket(), OrderOpenPrice(), new_sl, OrderTakeProfit(), 0, clrNONE);
               }
            } 
         } else if (OrderType() == 1) {
            double n = NormalizeDouble((OrderOpenPrice() - Ask) * 10000, 2); // zamiast 10000 daj getSymbolScale()
            //Print( n );
            double m = NormalizeDouble((OrderStopLoss() - Ask) * 10000, 2); // zamiast 10000 daj getSymbolScale()
            //Print( " m " + m );
            if (NormalizeDouble(((OrderOpenPrice() - Ask) * getSymbolScale()), 2) > startTS) {
               if (m > step) {
                  double new_sl = NormalizeDouble(OrderStopLoss()-(MarketInfo(Symbol(),MODE_STOPLEVEL)+TS*10)*Point,Digits); 
                  OrderModify(OrderTicket(), OrderOpenPrice(), new_sl, OrderTakeProfit(), 0, clrNONE);
               }
            }
         }         
      }
   }
}

double getSymbolScale() {
   double res = 0;
   if (Point == 0.00001) { // EURUSD, GBPUSD etc
      res = 10000; // ok
   } else if (Point == 0.001) { // USDJPPY etc
      res = 1000; // ?? do sprawdzenia
   } else if (Point == 0.01) { // DAX
      res = 100; // ?? do sprawdzenia
   }
   return res;
}
Tutaj jest wersja z prostym trailing stopem który aktywuje się po 20 pispach zysku i ma przesuwac co każde 10 pipsów ale coś skopałem, do poprawy jednak zysk zabezpiecza. I gdybyś rozwiązał zadanie wiedziałbyś co dalej z tym zrobić, jak to poprawić, ale...

Kod: Zaznacz cały

//+------------------------------------------------------------------+
//|                                     EATime31082018_BetaTest2.mq4 |
//|                        Copyright 2018, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
#property strict

extern int MagicNumber = 100;
extern int Slippage = 3;
extern double LotSize = 0.1;
int counter = 0;

extern int SL_POINT = 10;
extern int TP_POINT = 500;

//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
      MqlTick lastTick;
     
      /*
      if (Hour() > 7 && Hour() < 9) {
         // open order
         if(SymbolInfoTick(Symbol(),lastTick)) {
            //Print( lastTick.bid );
            if (lastTick.bid > iClose(Symbol(), PERIOD_D1, 1)) {
               sendBuyOrder();
            } else {
               sendSellOrder();
            }
         }
         
      }
      */
     
      if (Hour() == 18 && Minute() == 0) {
         // open order
         if(SymbolInfoTick(Symbol(),lastTick)) {
            //Print( lastTick.bid );
            if (lastTick.bid > iClose(Symbol(), PERIOD_H1, 3)) {
               //Print( iClose(Symbol(), PERIOD_H1, 3) );
               double sl_price = iClose(Symbol(), PERIOD_H1, 3);
               sendBuyOrder(sl_price);
            } else {
               //Print( iClose(Symbol(), PERIOD_H1, 3) );
               double sl_price = iClose(Symbol(), PERIOD_H1, 3);
               sendSellOrder(sl_price);             
            }
         }
         
      }
     
      if (Hour() == 23 && Minute() == 50) {
         // close order
         //manuallyCloseOrder();
      }
   
      //Print( iOpen(Symbol(), PERIOD_D1, 1) );
      //Print( iLow(Symbol(), PERIOD_D1, 1) );
      //Print( iHigh(Symbol(), PERIOD_D1, 1) );
     
      //Print( "test" );
      
      //trackOrderPL();
      
      trailingStop();
      
      //Print( " check point " + Point );
     
   
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) {}
//+------------------------------------------------------------------+

/*
void sendBuyOrder() {
   if (OrdersTotal() > 0) return;
   double minstoplevel_SL = MarketInfo(Symbol(),MODE_STOPLEVEL)+SL_POINT*10;
   double minstoplevel_TP = MarketInfo(Symbol(),MODE_STOPLEVEL)+TP_POINT*10;
   double stoploss = NormalizeDouble(Bid-minstoplevel_SL*Point,Digits);
   double takeprofit = NormalizeDouble(Bid+minstoplevel_TP*Point,Digits);
   OrderSend(Symbol(), OP_BUY, LotSize, Ask, Slippage, stoploss, takeprofit,"Buy[" + counter +"]", MagicNumber, 0, clrGreen);
   counter++;
}

void sendSellOrder() {
   if (OrdersTotal() > 0) return;
   double minstoplevel_SL = MarketInfo(Symbol(),MODE_STOPLEVEL)+SL_POINT*10;
   double minstoplevel_TP = MarketInfo(Symbol(),MODE_STOPLEVEL)+TP_POINT*10;
   double stoploss = NormalizeDouble(Ask+minstoplevel_SL*Point,Digits);
   double takeprofit = NormalizeDouble(Ask-minstoplevel_TP*Point,Digits);
   OrderSend(Symbol(), OP_SELL, LotSize, Bid, Slippage, stoploss, takeprofit,"Sell[" + counter +"]", MagicNumber, 0, clrRed);
   counter++;
}
*/

void sendBuyOrder(double sl_price) {
   if (OrdersTotal() > 0) return;
   double minstoplevel_TP = MarketInfo(Symbol(),MODE_STOPLEVEL)+TP_POINT*10;
   double takeprofit = NormalizeDouble(Bid+minstoplevel_TP*Point,Digits);
   OrderSend(Symbol(), OP_BUY, LotSize, Ask, Slippage, sl_price, takeprofit,"Buy[" + counter +"]", MagicNumber, 0, clrGreen);
   counter++;
}

void sendSellOrder(double sl_price) {
   if (OrdersTotal() > 0) return;
   double minstoplevel_TP = MarketInfo(Symbol(),MODE_STOPLEVEL)+TP_POINT*10;
   double takeprofit = NormalizeDouble(Ask-minstoplevel_TP*Point,Digits);
   OrderSend(Symbol(), OP_SELL, LotSize, Bid, Slippage, sl_price, takeprofit,"Sell[" + counter +"]", MagicNumber, 0, clrRed);
   counter++;
}

void manuallyCloseOrder() {
   for(int i=OrdersTotal(); i>=0; i--) {
      if(OrderSelect(i, SELECT_BY_POS)==true) {
         if (OrderType() == 0) {
            OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 0, clrNONE);
         } else if (OrderType() == 1) {
            OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 0, clrNONE);
         }
      }
   }
}

/*
 * Wersja z konkretnymi wartościami w 2 krokach, 
 * najpierw SL przesuwa na 40 pips zysku po przekroczeniu 60 pips
 * za drugim razem po przekroczeniu 100 pips przesuwa na 80 pisp zysku
 * Można do tego użyć TP na przykład 200 pips
 */
void trackOrderPL() {

   for(int i=OrdersTotal(); i>=0; i--) {
      if(OrderSelect(i, SELECT_BY_POS)==true) {
         //Print( OrderProfit() ); 
         if (OrderType() == 0) {        
            // zabezpiecz zysk po 60 pipsch
            if (NormalizeDouble(((Bid - OrderOpenPrice()) * getSymbolScale()), 2) > 60) {
               double new_sl = NormalizeDouble(OrderOpenPrice()+(MarketInfo(Symbol(),MODE_STOPLEVEL)+400)*Point,Digits);
            //Print( " 0 " + new_sl ); 
            OrderModify(OrderTicket(), OrderOpenPrice(), new_sl, OrderTakeProfit(), 0, clrNONE);
            }
         } else if (OrderType() == 1) {
            // zabezpiecz zysk po 60 pispch
            if (NormalizeDouble(((OrderOpenPrice() - Ask) * getSymbolScale()), 2) > 60) {
               double new_sl = NormalizeDouble(OrderOpenPrice()-(MarketInfo(Symbol(),MODE_STOPLEVEL)+400)*Point,Digits); 
               //Print( "1 " + new_sl ); 
               OrderModify(OrderTicket(), OrderOpenPrice(), new_sl, OrderTakeProfit(), 0, clrNONE);
            }
         }         
      }
   }
}

int startTS = 20;
int TS = 10;
int step = 20;
//****************************//
// WERSJA TESTOWANA DLA EURUSD 
// Mnożnik 10000
// Dla indeksu DAX będzie to chyba 1
// Dla USDJPY chyba będzie to 100
// Trzeba zrobic funkcje ktora bedzie zwracala jeden z tych 3 wariantow w zaleznosci od skalowania Symbol() 
// Ponieawż DAX ma 5 cyfr przed przecinkiem, z koleii EURUSD tylko 1, a USDJPY 3 cyfry.
// Najprosciej zrobic funkcje ktora bedzie to sprawdzac
// OK, tutaj jest dodana funckja getSymbolScale() ktora zwraca Point dla danego instrument - zdefiniowane sa 3 typy
//****************************//
void trailingStop() {
   for(int i=OrdersTotal(); i>=0; i--) {
      if(OrderSelect(i, SELECT_BY_POS)==true) {
         if (OrderType() == 0) {
            double n = NormalizeDouble((Ask - OrderOpenPrice()) * 10000, 2);  // zamiast 10000 daj getSymbolScale()
            //Print( n );
            double m = NormalizeDouble((Ask - OrderStopLoss()) * 10000, 2); // zamiast 10000 daj getSymbolScale()
            //Print( " m " + m ); 
            if (NormalizeDouble(((Bid - OrderOpenPrice()) * getSymbolScale()), 2) > startTS) {
               if (m > step) {
                  double new_sl = NormalizeDouble(OrderStopLoss()+(MarketInfo(Symbol(),MODE_STOPLEVEL)+TS*10)*Point,Digits);
                  OrderModify(OrderTicket(), OrderOpenPrice(), new_sl, OrderTakeProfit(), 0, clrNONE);
               }
            } 
         } else if (OrderType() == 1) {
            double n = NormalizeDouble((OrderOpenPrice() - Ask) * 10000, 2); // zamiast 10000 daj getSymbolScale()
            //Print( n );
            double m = NormalizeDouble((OrderStopLoss() - Ask) * 10000, 2); // zamiast 10000 daj getSymbolScale()
            //Print( " m " + m );
            if (NormalizeDouble(((OrderOpenPrice() - Ask) * getSymbolScale()), 2) > startTS) {
               if (m > step) {
                  double new_sl = NormalizeDouble(OrderStopLoss()-(MarketInfo(Symbol(),MODE_STOPLEVEL)+TS*10)*Point,Digits); 
                  OrderModify(OrderTicket(), OrderOpenPrice(), new_sl, OrderTakeProfit(), 0, clrNONE);
               }
            }
         }         
      }
   }
}

double getSymbolScale() {
   double res = 0;
   if (Point == 0.00001) { // EURUSD, GBPUSD etc
      res = 10000; // ok
   } else if (Point == 0.001) { // USDJPPY etc
      res = 1000; // ?? do sprawdzenia
   } else if (Point == 0.01) { // DAX
      res = 100; // ?? do sprawdzenia
   }
   return res;
}
To tyle z mojej strony.
Powodzenia.

-- Dodano: 02 wrz 2018, 14:16 --

Na przykład kolejnym pytanie mogłoby być... jak policzyć teraz wielkość pozycji dla danego ryzyka w stosunku do długości Stop Loss heh

Zlepek
Bywalec
Bywalec
Posty: 16
Rejestracja: 30 sie 2018, 09:00

Re: Poszukuję kogoś kto zrobił by dla mnie prosty automat

Nieprzeczytany post autor: Zlepek »

Dziękuję serdecznie jak dla mnie odwaliłeś kawał niesamowitej roboty. Jestem totalnie zielony w programowaniu i zaznaczyłem że jeśli będzie to coś komplikowanego mogę zapłacić za takie zlecenie bo jak by nie było straciłeś swój czas na to. Pewne rzeczy ogarnąłem jak zmienić czas i jakieś prymitywne podstawy. Dla mnie większości tego kodu to czarna magia mogę się jedynie domyślać o co tam może chodzić. Właśnie obczajam i sprawdzam jak to wychodzi na testach. Widzę że zabezpiecza mi pozycje ale muszę sz tym pokombinować bo nie do końca to jest tak jak chciałem. Obiecuję więcej nie męczyć bo tak jak mowie dla mnie jest to czarna magia a jestem dozgonnie wdzięczny za to co dla mnie zrobiłeś do tej pory. Ale tak jak sądziłem zmienny SL znacznie wpływa na wyniki i dzięki temu co zrobiłeś EAz 1.19 zwiększył się do 1.69 w ostatnich miesiącach. Zabezpiecza pozycję ale jeśli cokolwiek zrozumiałem dodaje on nie tak jak zamierzałem to robić. Będę siedział i próbował to jakoś ogarnąć. Jeszcze raz wielkie dzięki,

-rookie-
Maniak
Maniak
Posty: 2307
Rejestracja: 13 kwie 2015, 19:00

Re: Poszukuję kogoś kto zrobił by dla mnie prosty automat

Nieprzeczytany post autor: -rookie- »

Zlepek pisze:Dziękuję serdecznie jak dla mnie odwaliłeś kawał niesamowitej roboty. Jestem totalnie zielony w programowaniu i zaznaczyłem że jeśli będzie to coś komplikowanego mogę zapłacić za takie zlecenie bo jak by nie było straciłeś swój czas na to. Pewne rzeczy ogarnąłem jak zmienić czas i jakieś prymitywne podstawy. Dla mnie większości tego kodu to czarna magia mogę się jedynie domyślać o co tam może chodzić. Właśnie obczajam i sprawdzam jak to wychodzi na testach. Widzę że zabezpiecza mi pozycje ale muszę sz tym pokombinować bo nie do końca to jest tak jak chciałem. Obiecuję więcej nie męczyć bo tak jak mowie dla mnie jest to czarna magia a jestem dozgonnie wdzięczny za to co dla mnie zrobiłeś do tej pory. Ale tak jak sądziłem zmienny SL znacznie wpływa na wyniki i dzięki temu co zrobiłeś EAz 1.19 zwiększył się do 1.69 w ostatnich miesiącach. Zabezpiecza pozycję ale jeśli cokolwiek zrozumiałem dodaje on nie tak jak zamierzałem to robić. Będę siedział i próbował to jakoś ogarnąć. Jeszcze raz wielkie dzięki,
Nie ma innej opcji, musisz teraz sam poświęcić trochę czasu na zrozumienie jak kodować w MQL. Spróbuj rozwiązać ten problem tak jak opisałem (poszukuje-kogos-kto-zrobil-by-dla-mnie- ... ml#p922505) . Jak Ci się uda to będziesz wiedział jak poprawić te EA które wrzuciłem tak jak chcesz. Włącz kiedyś jak najdzie Cię ochota i będziesz zmuszony do poprawy tego kodu dokumentacje https://docs.mql4.com/ i spróbuj rozwiązać to zadanie, wtedy się nauczysz kilku rzeczy i nie będziesz kompletnie zielony. Po prostu musisz siąść z tym i zacząć próbować wywoływać funkcje itp np Print( 2 + 2); albo Print( Symbol() ); itd. Musisz posprawdzać co zwracają konkretne funkcje następnie jak liczą, jak zachowują się instrukcje warunkowe, pętle. Po pierwszym dniu to wszystko wydaje się skomplikowane ale jeszcze raz powtórzę, spróbuj rozwiązać to zadanie (poszukuje-kogos-kto-zrobil-by-dla-mnie- ... ml#p922505) , wstawiaj do Print cokolwiek i zobacz co wyświetla w zakładce Journal. Naciskaj F12 żeby dać kolejną świece tak jak napisałem i w ten sposób dojdziesz jako to działa i jak kodować. Powodzenia.

Zlepek
Bywalec
Bywalec
Posty: 16
Rejestracja: 30 sie 2018, 09:00

Re: Poszukuję kogoś kto zrobił by dla mnie prosty automat

Nieprzeczytany post autor: Zlepek »

//+------------------------------------------------------------------+
//| cosztrailingstopem.mq4 |
//| Copyright 2018, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict

extern int MagicNumber = 16701;
extern int Slippage = 3;
extern double LotSize = 0.05;
int counter = 0;
extern int distance_between_HighLow_and_Stoploss = 0; // mozna tutaj przesunac stop loss w pipsach od jakiegos poziomu 10 = 1 pips
extern int SL_POINT = 35;
extern int TP_POINT =39;
int startTS = 20;
int TS = 10;
int step = 20;

//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---

//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---

}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
MqlTick lastTick;

if (Hour() == 14 && Minute() == 01) {
// open order
if(SymbolInfoTick(Symbol(),lastTick)) {
//Print( lastTick.bid );
if (lastTick.bid > iOpen(Symbol(), PERIOD_H1, 3)) {
sendBuyOrder();
} else {
sendSellOrder();
}
}

}
if (Hour() == 23 && Minute() == 57) {
// close order
manuallyCloseOrder();
}

for(int i=OrdersTotal(); i>=0; i--) {
if(OrderSelect(i, SELECT_BY_POS)==true) {
if (OrderType() == 0) {
double n = NormalizeDouble((Ask - OrderOpenPrice()) * getSymbolScale(), 2);
//Print( n );
double m = NormalizeDouble((Ask - OrderStopLoss()) * getSymbolScale(), 2);
//Print( " m " + m );
if (NormalizeDouble(((Bid - OrderOpenPrice()) * getSymbolScale()), 2) > startTS) {
if (m > step) {
double new_sl = NormalizeDouble(OrderStopLoss()+(MarketInfo(Symbol(),MODE_STOPLEVEL)+TS*10)*Point,Digits);
OrderModify(OrderTicket(), OrderOpenPrice(), new_sl, OrderTakeProfit(), 0, clrNONE);
}
}
} else if (OrderType() == 1) {
double n = NormalizeDouble((OrderOpenPrice() - Ask) * getSymbolScale(), 2);
//Print( n );
double m = NormalizeDouble((OrderStopLoss() - Ask) * getSymbolScale(), 2);
//Print( " m " + m );
if (NormalizeDouble(((OrderOpenPrice() - Ask) * getSymbolScale()), 2) > startTS) {
if (m > step) {
double new_sl = NormalizeDouble(OrderStopLoss()-(MarketInfo(Symbol(),MODE_STOPLEVEL)+TS*10)*Point,Digits);
OrderModify(OrderTicket(), OrderOpenPrice(), new_sl, OrderTakeProfit(), 0, clrNONE);
}
}
}
}
}
}

//Print( iOpen(Symbol(), PERIOD_D1, 1) );
//Print( iLow(Symbol(), PERIOD_D1, 1) );
//Print( iHigh(Symbol(), PERIOD_D1, 1) );



//+------------------------------------------------------------------+
//| ChartEvent function |
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) {}
//+------------------------------------------------------------------+

void sendBuyOrder() {
if (OrdersTotal() > 0) return;
double minstoplevel_SL = MarketInfo(Symbol(),MODE_STOPLEVEL)+SL_POINT*10;
double minstoplevel_TP = MarketInfo(Symbol(),MODE_STOPLEVEL)+TP_POINT*10;
double stoploss = NormalizeDouble(Bid-minstoplevel_SL*Point,Digits);
double takeprofit = NormalizeDouble(Bid+minstoplevel_TP*Point,Digits);
OrderSend(Symbol(), OP_BUY, LotSize, Ask, Slippage, stoploss, takeprofit,"Buy[" + counter +"]", MagicNumber, 0, clrGreen);
counter++;
}

void sendSellOrder() {
if (OrdersTotal() > 0) return;
double minstoplevel_SL = MarketInfo(Symbol(),MODE_STOPLEVEL)+SL_POINT*10;
double minstoplevel_TP = MarketInfo(Symbol(),MODE_STOPLEVEL)+TP_POINT*10;
double stoploss = NormalizeDouble(Ask+minstoplevel_SL*Point,Digits);
double takeprofit = NormalizeDouble(Ask-minstoplevel_TP*Point,Digits);
OrderSend(Symbol(), OP_SELL, LotSize, Bid, Slippage, stoploss, takeprofit,"Sell[" + counter +"]", MagicNumber, 0, clrRed);
counter++;
}

void manuallyCloseOrder() {
for(int i=OrdersTotal(); i>=0; i--) {
if(OrderSelect(i, SELECT_BY_POS)==true) {
if (OrderType() == 0) {
OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 0, clrNONE);
} else if (OrderType() == 1) {
OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 0, clrNONE);
}
}
}
}
double getSymbolScale() {
double res = 0;
if (Point == 0.00001) { // EURUSD, GBPUSD etc
res = 10000; // ok
} else if (Point == 0.001) { // USDJPPY etc
res = 1000; //
} else if (Point == 0.01) { // DAX
res = 100; //
}
return res;
}
Zmienia SL ale czy to jest dobrze ? Wyczytałem gdzieś że trailing stop powinien być w funkcji void OnTick() Czy teraz pomożesz ? W sumie chciałbym prosić o sprawdzenie czy dobrze to zrobiłem.

-rookie-
Maniak
Maniak
Posty: 2307
Rejestracja: 13 kwie 2015, 19:00

Re: Poszukuję kogoś kto zrobił by dla mnie prosty automat

Nieprzeczytany post autor: -rookie- »

Zlepek pisze:Zmienia SL ale czy to jest dobrze ? Wyczytałem gdzieś że trailing stop powinien być w funkcji void OnTick() Czy teraz pomożesz ? W sumie chciałbym prosić o sprawdzenie czy dobrze to zrobiłem.
Wszystko dobrze, tylko coś nie może odczytać zmiennych globalnych startTS, TS, step, dlatego wywołałem je jeszcze raz wewnątrz funkcji onTick(). Zmienne globalne u samej góry mają w nazwie kreskę a wewnątrz onTick są zdefiniowane przed tym kodem jako te poprzednie zmienne bez kreski i teraz nie ma błędu. Tak w ogóle to miałeś ten kod przecież w funkcji trailingStop() (poszukuje-kogos-kto-zrobil-by-dla-mnie- ... ml#p922509) , to jest to samo bo wywołujesz ten kod tylko odnosząc się do funkcji w które się znajduje, na jedno wychodzi. Tyle że mając właśnie ten kod w osobnej funkcji a nie bezpośrednio w onTick możesz łatwiej nią sterować niż takim kodem bezpośrednio umieszczonym w onTick jak teraz, ale dlaczego tak jest to zrozumiesz za jakiś czas jak będziesz więcej kodował. Ogólnie wszystko dobrze zrobiłeś, tylko coś nie chciało odczytać tych zmiennych dlatego zdefiniowałem je jeszcze raz wewnątrz onTick i do nich przypisałem zmienne u samej góry z kreską na początku w nazwie.

Kod: Zaznacz cały

//+------------------------------------------------------------------+
//| cosztrailingstopem.mq4 |
//| Copyright 2018, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict

extern int MagicNumber = 16701;
extern int Slippage = 3;
extern double LotSize = 0.05;
int counter = 0;
extern int distance_between_HighLow_and_Stoploss = 0; // mozna tutaj przesunac stop loss w pipsach od jakiegos poziomu 10 = 1 pips
extern int SL_POINT = 35;
extern int TP_POINT =39;
int _startTS = 20;
int _TS = 10;
int _step = 20;

//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---

//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---

}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
MqlTick lastTick;

if (Hour() == 14 && Minute() == 01) {
// open order
if(SymbolInfoTick(Symbol(),lastTick)) {
//Print( lastTick.bid );
if (lastTick.bid > iOpen(Symbol(), PERIOD_H1, 3)) {
sendBuyOrder();
} else {
sendSellOrder();
}
}

}
if (Hour() == 23 && Minute() == 57) {
// close order
manuallyCloseOrder();
}

int startTS = _startTS;
int TS = _TS;
int step = _step;

for(int i=OrdersTotal(); i>=0; i--) {
if(OrderSelect(i, SELECT_BY_POS)==true) {
if (OrderType() == 0) {
double n = NormalizeDouble((Ask - OrderOpenPrice()) * getSymbolScale(), 2);
//Print( n );
double m = NormalizeDouble((Ask - OrderStopLoss()) * getSymbolScale(), 2);
//Print( " m " + m );
if (NormalizeDouble(((Bid - OrderOpenPrice()) * getSymbolScale()), 2) > startTS) {
if (m > step) {
double new_sl = NormalizeDouble(OrderStopLoss()+(MarketInfo(Symbol(),MODE_STOPLEVEL)+TS*10)*Point,Digits);
OrderModify(OrderTicket(), OrderOpenPrice(), new_sl, OrderTakeProfit(), 0, clrNONE);
}
}
} else if (OrderType() == 1) {
double n = NormalizeDouble((OrderOpenPrice() - Ask) * getSymbolScale(), 2);
//Print( n );
double m = NormalizeDouble((OrderStopLoss() - Ask) * getSymbolScale(), 2);
//Print( " m " + m );
if (NormalizeDouble(((OrderOpenPrice() - Ask) * getSymbolScale()), 2) > startTS) {
if (m > step) {
double new_sl = NormalizeDouble(OrderStopLoss()-(MarketInfo(Symbol(),MODE_STOPLEVEL)+TS*10)*Point,Digits);
OrderModify(OrderTicket(), OrderOpenPrice(), new_sl, OrderTakeProfit(), 0, clrNONE);
}
}
}
}
}
}

//Print( iOpen(Symbol(), PERIOD_D1, 1) );
//Print( iLow(Symbol(), PERIOD_D1, 1) );
//Print( iHigh(Symbol(), PERIOD_D1, 1) );



//+------------------------------------------------------------------+
//| ChartEvent function |
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) {}
//+------------------------------------------------------------------+

void sendBuyOrder() {
if (OrdersTotal() > 0) return;
double minstoplevel_SL = MarketInfo(Symbol(),MODE_STOPLEVEL)+SL_POINT*10;
double minstoplevel_TP = MarketInfo(Symbol(),MODE_STOPLEVEL)+TP_POINT*10;
double stoploss = NormalizeDouble(Bid-minstoplevel_SL*Point,Digits);
double takeprofit = NormalizeDouble(Bid+minstoplevel_TP*Point,Digits);
OrderSend(Symbol(), OP_BUY, LotSize, Ask, Slippage, stoploss, takeprofit,"Buy[" + counter +"]", MagicNumber, 0, clrGreen);
counter++;
}

void sendSellOrder() {
if (OrdersTotal() > 0) return;
double minstoplevel_SL = MarketInfo(Symbol(),MODE_STOPLEVEL)+SL_POINT*10;
double minstoplevel_TP = MarketInfo(Symbol(),MODE_STOPLEVEL)+TP_POINT*10;
double stoploss = NormalizeDouble(Ask+minstoplevel_SL*Point,Digits);
double takeprofit = NormalizeDouble(Ask-minstoplevel_TP*Point,Digits);
OrderSend(Symbol(), OP_SELL, LotSize, Bid, Slippage, stoploss, takeprofit,"Sell[" + counter +"]", MagicNumber, 0, clrRed);
counter++;
}

void manuallyCloseOrder() {
for(int i=OrdersTotal(); i>=0; i--) {
if(OrderSelect(i, SELECT_BY_POS)==true) {
if (OrderType() == 0) {
OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 0, clrNONE);
} else if (OrderType() == 1) {
OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 0, clrNONE);
}
}
}
}
double getSymbolScale() {
double res = 0;
if (Point == 0.00001) { // EURUSD, GBPUSD etc
res = 10000; // ok
} else if (Point == 0.001) { // USDJPPY etc
res = 1000; //
} else if (Point == 0.01) { // DAX
res = 100; //
}
return res;
}
-- Dodano: 03 wrz 2018, 12:54 --

https://docs.mql4.com/basis/function

Zlepek
Bywalec
Bywalec
Posty: 16
Rejestracja: 30 sie 2018, 09:00

Re: Poszukuję kogoś kto zrobił by dla mnie prosty automat

Nieprzeczytany post autor: Zlepek »

Kod: Zaznacz cały

//+------------------------------------------------------------------+
//| cosztrailingstopem.mq4 |
//| Copyright 2018, MetaQuotes Software Corp. |
//| https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, MetaQuotes Software Corp."
#property link "https://www.mql5.com"
#property version "1.00"
#property strict

extern int MagicNumber = 16701;
extern int Slippage = 3;
extern double LotSize = 0.05;
int counter = 0;
extern int distance_between_HighLow_and_Stoploss = 0; // mozna tutaj przesunac stop loss w pipsach od jakiegos poziomu 10 = 1 pips
extern int SL_POINT = 35;
extern int TP_POINT =39;
int _startTS = 20;
int _TS = 10;
int _step = 20;

//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//---

//---
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---

}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//---
MqlTick lastTick;

if (Hour() == 14 && Minute() == 01) {
// open order
if(SymbolInfoTick(Symbol(),lastTick)) {
//Print( lastTick.bid );
if (lastTick.bid > iOpen(Symbol(), PERIOD_H1, 3)) {
sendBuyOrder();
} else {
sendSellOrder();
}
}

}
if (Hour() == 23 && Minute() == 57) {
// close order
manuallyCloseOrder();
}

int startTS = _startTS;
int TS = _TS;
int step = _step;

for(int i=OrdersTotal(); i>=0; i--) {
if(OrderSelect(i, SELECT_BY_POS)==true) {
if (OrderType() == 0) {
double n = NormalizeDouble((Ask - OrderOpenPrice()) * getSymbolScale(), 2);
//Print( n );
double m = NormalizeDouble((Ask - OrderStopLoss()) * getSymbolScale(), 2);
//Print( " m " + m );
if (NormalizeDouble(((Bid - OrderOpenPrice()) * getSymbolScale()), 2) > startTS) {
if (m > step) {
double new_sl = NormalizeDouble(OrderStopLoss()+(MarketInfo(Symbol(),MODE_STOPLEVEL)+TS*10)*Point,Digits);
OrderModify(OrderTicket(), OrderOpenPrice(), new_sl, OrderTakeProfit(), 0, clrNONE);
}
}
} else if (OrderType() == 1) {
double n = NormalizeDouble((OrderOpenPrice() - Ask) * getSymbolScale(), 2);
//Print( n );
double m = NormalizeDouble((OrderStopLoss() - Ask) * getSymbolScale(), 2);
//Print( " m " + m );
if (NormalizeDouble(((OrderOpenPrice() - Ask) * getSymbolScale()), 2) > startTS) {
if (m > step) {
double new_sl = NormalizeDouble(OrderStopLoss()-(MarketInfo(Symbol(),MODE_STOPLEVEL)+TS*10)*Point,Digits);
OrderModify(OrderTicket(), OrderOpenPrice(), new_sl, OrderTakeProfit(), 0, clrNONE);
}
}
}
}
}
}

//Print( iOpen(Symbol(), PERIOD_D1, 1) );
//Print( iLow(Symbol(), PERIOD_D1, 1) );
//Print( iHigh(Symbol(), PERIOD_D1, 1) );



//+------------------------------------------------------------------+
//| ChartEvent function |
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) {}
//+------------------------------------------------------------------+

void sendBuyOrder() {
if (OrdersTotal() > 0) return;
double minstoplevel_SL = MarketInfo(Symbol(),MODE_STOPLEVEL)+SL_POINT*10;
double minstoplevel_TP = MarketInfo(Symbol(),MODE_STOPLEVEL)+TP_POINT*10;
double stoploss = NormalizeDouble(Bid-minstoplevel_SL*Point,Digits);
double takeprofit = NormalizeDouble(Bid+minstoplevel_TP*Point,Digits);
OrderSend(Symbol(), OP_BUY, LotSize, Ask, Slippage, stoploss, takeprofit,"Buy[" + counter +"]", MagicNumber, 0, clrGreen);
counter++;
}

void sendSellOrder() {
if (OrdersTotal() > 0) return;
double minstoplevel_SL = MarketInfo(Symbol(),MODE_STOPLEVEL)+SL_POINT*10;
double minstoplevel_TP = MarketInfo(Symbol(),MODE_STOPLEVEL)+TP_POINT*10;
double stoploss = NormalizeDouble(Ask+minstoplevel_SL*Point,Digits);
double takeprofit = NormalizeDouble(Ask-minstoplevel_TP*Point,Digits);
OrderSend(Symbol(), OP_SELL, LotSize, Bid, Slippage, stoploss, takeprofit,"Sell[" + counter +"]", MagicNumber, 0, clrRed);
counter++;
}

void manuallyCloseOrder() {
for(int i=OrdersTotal(); i>=0; i--) {
if(OrderSelect(i, SELECT_BY_POS)==true) {
if (OrderType() == 0) {
OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 0, clrNONE);
} else if (OrderType() == 1) {
OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 0, clrNONE);
}
}
}
}
double getSymbolScale() {
double res = 0;
if (Point == 0.00001) { // EURUSD, GBPUSD etc
res = 10000; // ok
} else if (Point == 0.001) { // USDJPPY etc
res = 1000; //
} else if (Point == 0.01) { // DAX
res = 100; //
}
return res;
}
Nie wiem czemu ale dalej generuje mi błędy nawet po skopiowaniu teg co wstawiłeś.
https://www.fotosik.pl/zdjecie/pelne/0ae47fc73a13af11

-rookie-
Maniak
Maniak
Posty: 2307
Rejestracja: 13 kwie 2015, 19:00

Re: Poszukuję kogoś kto zrobił by dla mnie prosty automat

Nieprzeczytany post autor: -rookie- »

Zlepek pisze:Nie wiem czemu ale dalej generuje mi błędy nawet po skopiowaniu teg co wstawiłeś.
https://www.fotosik.pl/zdjecie/pelne/0ae47fc73a13af11
https://www.google.com/search?q=mt4+tes ... refox-b-ab
To nie jest błąd w kodzie EA, tylko jakieś błedy w odczytywaniu danych historycznych :think:
U mnie to samo wywala, ponad 1000 błedów a w logach widzę że to są błędy z ceną high, low, itp
...
2018.09.03 14:57:40.111 TestGenerator: 1244 generating errors, logged 100 first error records
...
1 12:36:17.132 TestGenerator: unmatched data error (volume limit 203 at 2018.05.14 07:40 exceeded)
1 12:36:17.254 TestGenerator: unmatched data error (volume limit 279 at 2018.05.24 21:45 exceeded)
1 12:36:17.254 TestGenerator: unmatched data error (low value 1.17230 at 2018.05.24 22:15 is not reached from the least timeframe, low price 1.17233 mismatches)
1 12:36:17.325 TestGenerator: unmatched data error (high value 1.16796 at 2018.05.31 17:55 is not reached from the least timeframe, high price 1.16774 mismatches)
1 12:36:17.325 TestGenerator: unmatched data error (low value 1.16659 at 2018.05.31 17:55 is not reached from the least timeframe, low price 1.16691 mismatches)
1 12:36:18.017 TestGenerator: unmatched data error (high value 1.16813 at 2018.06.25 15:50 and price 1.16848 mismatched)
1 12:36:18.017 TestGenerator: unmatched data error (volume limit 32 at 2018.06.25 15:50 exceeded)
1 12:36:18.017 TestGenerator: unmatched data error (volume limit 32 at 2018.06.25 15:50 exceeded)
1 12:36:18.017 TestGenerator: unmatched data error (volume limit 32 at 2018.06.25 15:50 exceeded)
1 12:36:18.017 TestGenerator: unmatched data error (volume limit 32 at 2018.06.25 15:50 exceeded)

...
:568:
Ktoś z większym doświadczeniem na MT4 może powie o co chodzi dokładnie, ja nie wiem z czego te błędy wynikają. Używam jforex do pisania botów i testów, na MT4 to każdy broker ma inne kwotowania, a na jforex mam wszystko w jednym miejscu, dlatego wiem tylko tyle ile potrzebne żeby coś tam napisać pod MT4 i tyle...

ODPOWIEDZ