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

O jezykach programowania w platformach i nie tylko.
grzesq
Stały bywalec
Stały bywalec
Posty: 30
Rejestracja: 10 lip 2009, 16:57

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

Nieprzeczytany post autor: grzesq »

Pytanie dajesz radę po angielsku jezeli tak to tu masz skarbnice wiedzy: https://www.mql5.com/en/articles/mt4

Co do zamieszczonego kodu, skoro chcesz kombinować to nie dam ci gotowej odpowiedzi tylko kilka wskazówek:
Twój cel jeśli dobrze rozumiem to to przestawić sl na nowy poziom ale:

- Czy ten algorytm działa tylko dla EA czy wszystkich pozycji
- Czy tak samo wyliczasz SL dla pozycji buy i sell?
- Co zwróci OrderStopLoss()?
- Co zwróci MarketInfo(Symbol(),MODE_STOPLEVEL) i dlaczego?
- Jaka będzie ostateczna wartość SL jeśli powiększysz istniejący SL o środek poprzedniego słupka?

Ten akurat problem to nie jest coś co doczytasz raczej sam musisz na to "wpaść". Jezeli moge cos zasugerowac to w tym przypadku papier i ołówek. Rozrysuj sobie każda możliwość np. mam otwarta pozycje buy po cenie X i cena wzrasta do X+y/cena spada do X-y następnie poprzedni słupek jest UP/DOWN . Jak ułożysz i rozrysujesz sobie taki scenariusz to programowanie stanie się prostsze.

Powodzenia.

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

No całkiem nieźle kombinujesz z tym SL na 1/2 świecy, pewnie tutaj wywaliło błąd if OrderOpenPrice > m - bo nie dałeś nawiasów OrderOpenPrice() > m .

Na TJS był kurs kodowania w MQL https://www.youtube.com/results?search_query=mql+tjs

W ogóle to baw się teraz MQL i próbuj coś zbudować z funkcji tego języka, z dokumentacji ale... jak chcesz się nauczyć podstaw to lepiej przejrzyj jakiś kurs pisania w C++ albo w Java żeby poznać konkretny język. MQL to pochodna C++ chyba. Tutaj jest ciekawy kanał do nauki C++ https://youtu.be/tT8ICXAO_-4?list=PLGLf ... P9M&t=1415
https://www.youtube.com/results?search_ ... +beginners

grzesq
Stały bywalec
Stały bywalec
Posty: 30
Rejestracja: 10 lip 2009, 16:57

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

Nieprzeczytany post autor: grzesq »

--rookie-- tutaj bede z Toba polemizowal :) MQL owszem ma składanie podobna do C++ i próbuje go IMHO nieudolnie naśladować, ale ma sporo ograniczeń i dodatkowo jest koszmarnie wolny. Jezeli mowimy tylko o nauce pisania własnych prostych EA to nie wiem czy jest sens rzucać się od razu na c++/java/c#.

Stosując dll albo port do c# można ominąć częściowo niedogodność mql ale to kosztuje więcej pracy, generalnie temat na inna opowiesc.

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 »

Właśnie skończyłem oglądać MQL Od Kuchni i powiem szczerze że Agnieszka Śpica przez kilka ładnych godzin koduje robota który nie działa :) Nie powiem że czas zmarnowany ale lekka frustracja :)
Możliwe że jest to starsza wersja i niektóre funkcje zostały zastąpione:)

-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:Właśnie skończyłem oglądać MQL Od Kuchni i powiem szczerze że Agnieszka Śpica przez kilka ładnych godzin koduje robota który nie działa :) Nie powiem że czas zmarnowany ale lekka frustracja :)
Możliwe że jest to starsza wersja i niektóre funkcje zostały zastąpione:)
Masz wyjaśnione w nagraniu s01e07 jak te magic number ustawić, tak od 35 min.

-- Dodano: 05 wrz 2018, 02:21 --

Faktycznie to EA nie działa

Ok, tutaj jest wersja poprawiona która otwiera pozycje po zmianie sygnału, po przecięciu średnich. W ogóle nie rozumiem funkcji OpenOrdersThisPair(), zastąpiłem to funkcją closeIfDirectionHasChanged() która sprawdza aktualny sygnał z przecięcia średnich i jeśli otwarty jest BUY a sygnał jest na SELL wtedy zamyka tę pozycje i otwiera SELL... i tak w kółko.

Kod: Zaznacz cały

//+------------------------------------------------------------------+
//|                                               ASTest05092018.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 TakeProfit = 50;
extern int StopLoss = 25;

extern bool UseToBreakeven = true;
extern int WhenToMoveBe = 100;
extern int PipsToLockIn = 5;

extern int FastME = 5;
extern int FastMEShift = 0;
extern int FastMEMethod = 0;
extern int FastMEAppliedTo = 0;

extern int SlowME = 21;
extern int SlowMEShift = 0;
extern int SlowMEMethod = 0;
extern int SlowMEAppliedTo = 0;

extern double LotSize = 0.01;
extern int MagicNumber = 1234;
double pips;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   double tickSize = MarketInfo(Symbol(), MODE_TICKSIZE);
   if (tickSize == 0.00001 || tickSize == 0.001)
   pips = tickSize*10;
   else pips = tickSize;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   start();
   CheckForMeTrade();
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id,
                  const long &lparam,
                  const double &dparam,
                  const string &sparam)
  {
//---
   
  }
//+------------------------------------------------------------------+

int start() {
   if (UseToBreakeven == true) MoveToBreakeven();
   if (IsNewCandle() == true) CheckForMeTrade();
   return(0);
}

void MoveToBreakeven() {
   for (int b = OrdersTotal() - 1; b >= 0; b --) {
      if (OrderSelect(b , SELECT_BY_POS, MODE_TRADES))
         if (OrderMagicNumber() != MagicNumber) continue;
            if (OrderType() == OP_BUY)
               if (Bid - OrderOpenPrice() > WhenToMoveBe * pips)
                  if (OrderOpenPrice() > OrderStopLoss())
                     OrderModify(OrderTicket(), OrderOpenPrice(), OrderClosePrice() + (PipsToLockIn * pips), OrderTakeProfit(), 0, clrNONE);
   }
   for (int s = OrdersTotal() - 1; s >= 0; s --) {
      if (OrderSelect(s , SELECT_BY_POS, MODE_TRADES))
         if (OrderMagicNumber() != MagicNumber) continue;
            if (OrderType() == OP_SELL)
               if (Bid - OrderOpenPrice() - Ask > WhenToMoveBe * pips)
                  if (OrderOpenPrice() < OrderStopLoss())
                     OrderModify(OrderTicket(), OrderOpenPrice(), OrderClosePrice() - (PipsToLockIn * pips), OrderTakeProfit(), 0, clrNONE);
   }
}

bool IsNewCandle() {
   static int BarsOnChart = 0;
   if (Bars == BarsOnChart) 
   return(false);
   BarsOnChart = Bars;
   return(true);
}

void CheckForMeTrade() {
   int signal = 0;
   double PreviousFast = iMA(NULL, 0, FastME, FastMEShift, FastMEMethod, FastMEAppliedTo, 2);
   double CurrentFast = iMA(NULL, 0, FastME, FastMEShift, FastMEMethod, FastMEAppliedTo, 1);
   double PreviousSlow = iMA(NULL, 0, SlowME, SlowMEShift, SlowMEMethod, SlowMEAppliedTo, 2);
   double CurrentSlow = iMA(NULL, 0, SlowME, SlowMEShift, SlowMEMethod, SlowMEAppliedTo, 1);
   if (PreviousFast < PreviousSlow && CurrentFast > CurrentSlow) { 
      //Print( " signal buy " + 0); 
      signal = 0; 
      closeIfDirectionHasChanged(signal);
      OrderEntry(0);
   }
   if (PreviousFast > PreviousSlow && CurrentFast < CurrentSlow) { 
      //Print( " signal sell " + 1); 
      signal = 1; 
      closeIfDirectionHasChanged(signal);
      OrderEntry(1); 
   }
}

void OrderEntry(int direction) {
   if (OrdersTotal() > 0) return;
   if (direction == 0) 
     // if (OpenOrdersThisPair(Symbol()) <= 1) 
         //OrderSend(Symbol(), OP_BUY, LotSize, Ask, 3, Ask-(StopLoss*pips), Ask+(TakeProfit*pips), NULL, MagicNumber, 0, clrGreen);
         OrderSend(Symbol(), OP_BUY, LotSize, Ask, 3, 0, 0, NULL, MagicNumber, 0, clrGreen);
         //Print( "send buy order" );
   else if (direction == 1) 
     // if (OpenOrdersThisPair(Symbol()) <= 1) 
         //OrderSend(Symbol(), OP_SELL, LotSize, Bid, 3, Bid+(StopLoss*pips), Bid-(TakeProfit*pips), NULL, MagicNumber, 0, clrRed);
         OrderSend(Symbol(), OP_SELL, LotSize, Bid, 3, 0, 0, NULL, MagicNumber, 0, clrRed);
        // Print( "send sell" );
}

int OpenOrdersThisPair(string pair) {
   int total = 0;
   for (int i = OrdersTotal() - 1; i >= 0; i --) 
      if (OrderSelect(i , SELECT_BY_POS, MODE_TRADES))
         Print( i );
         if (OrderSymbol() == pair) total++;
   Print( total );
   return(total);
}

void closeIfDirectionHasChanged(int signal) {
   for (int i = OrdersTotal(); i >= 0; i --) {
      if (OrderSelect(i , SELECT_BY_POS) == true) {
         if (signal == 0 && OrderType() == 1) {
            OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_ASK), 0, clrNONE);
         } else if (signal == 1 && OrderType() == 0) {
            OrderClose(OrderTicket(), OrderLots(), MarketInfo(OrderSymbol(), MODE_BID), 0, clrNONE);
         } 
      }
   } 
   Print( "test signal " + signal );
}
Nie poprawiałem całego kodu, to znaczy nie przepisywałem całego kodu, tylko to co jest do 10 minuty nagrania s01e07

-- Dodano: 05 wrz 2018, 02:31 --

Chyba wtedy zapomniała wywołać w onTick() funkcji CheckForMeTrade() która właśnie ma sprawdzać przecięcie średnich i wysyłać zlecenie BUY albo SELL. Nie wywołała tego dlatego to EA nie odpaliło (chyba :think: Nie widzę nic wywołanego w onTick() na tym nagraniu dlatego test się nie uruchomił).

-- Dodano: 05 wrz 2018, 02:40 --

Aha, ta funkcja OpenOrdersThisPair() miała sprawdzać ilość otwartych zleceń na danym instrumencie. Ja tutaj użyłem if (OrdersTotal() > 0) return; na początku funkcji void OrderEntry(int direction) { żeby przerwać dodawanie kolejnych pozycji jeśli coś jest już otwarte. Tylko to sprawdza właśnie wszystkie otwarte pozycje, a ta funkcja OpenOrdersThisPair() ma sprawdzać tylko pozycje otwarte na danym instrumencie... ale chyba zapomniała wywołać CheckForMeTrade() w onTick dlatego nie odpaliło testu.

-- Dodano: 05 wrz 2018, 02:44 --

To znaczy start() bo to CheckForMeTrade() jest w funkcji start() i chyba zapomniała w onTick() wywołać start();

-- Dodano: 05 wrz 2018, 03:05 --

Yep, zapomniała wyowłać start() w onTick()
Tutaj jest kod z pierwszych 10 minut nagrania s01e07 i wszystko jest ok tylko zapomniała w onTick() dać start() i tyle

Kod: Zaznacz cały

//+------------------------------------------------------------------+
//|                                               ASTest05092018.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 TakeProfit = 50;
extern int StopLoss = 25;

extern bool UseToBreakeven = true;
extern int WhenToMoveBe = 100;
extern int PipsToLockIn = 5;

extern int FastME = 5;
extern int FastMEShift = 0;
extern int FastMEMethod = 0;
extern int FastMEAppliedTo = 0;

extern int SlowME = 21;
extern int SlowMEShift = 0;
extern int SlowMEMethod = 0;
extern int SlowMEAppliedTo = 0;

extern double LotSize = 0.01;
extern int MagicNumber = 1234;
double pips;
//+------------------------------------------------------------------+
//| Expert initialization function                                   |
//+------------------------------------------------------------------+
int OnInit()
  {
//---
   double tickSize = MarketInfo(Symbol(), MODE_TICKSIZE);
   if (tickSize == 0.00001 || tickSize == 0.001)
   pips = tickSize*10;
   else pips = tickSize;
//---
   return(INIT_SUCCEEDED);
  }
//+------------------------------------------------------------------+
//| Expert deinitialization function                                 |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
  {
//---
   
  }
//+------------------------------------------------------------------+
//| Expert tick function                                             |
//+------------------------------------------------------------------+
void OnTick()
  {
//---
   start();
  }
//+------------------------------------------------------------------+
//| ChartEvent function                                              |
//+------------------------------------------------------------------+
void OnChartEvent(const int id, const long &lparam, const double &dparam, const string &sparam) {}
//+------------------------------------------------------------------+

int start() {
   if (UseToBreakeven == true) MoveToBreakeven();
   if (IsNewCandle() == true) CheckForMeTrade();
   return(0);
}

void MoveToBreakeven() {
   for (int b = OrdersTotal() - 1; b >= 0; b --) {
      if (OrderSelect(b , SELECT_BY_POS, MODE_TRADES))
         if (OrderMagicNumber() != MagicNumber) continue;
            if (OrderType() == OP_BUY)
               if (Bid - OrderOpenPrice() > WhenToMoveBe * pips)
                  if (OrderOpenPrice() > OrderStopLoss())
                     OrderModify(OrderTicket(), OrderOpenPrice(), OrderClosePrice() + (PipsToLockIn * pips), OrderTakeProfit(), 0, clrNONE);
   }
   for (int s = OrdersTotal() - 1; s >= 0; s --) {
      if (OrderSelect(s , SELECT_BY_POS, MODE_TRADES))
         if (OrderMagicNumber() != MagicNumber) continue;
            if (OrderType() == OP_SELL)
               if (Bid - OrderOpenPrice() - Ask > WhenToMoveBe * pips)
                  if (OrderOpenPrice() < OrderStopLoss())
                     OrderModify(OrderTicket(), OrderOpenPrice(), OrderClosePrice() - (PipsToLockIn * pips), OrderTakeProfit(), 0, clrNONE);
   }
}

bool IsNewCandle() {
   static int BarsOnChart = 0;
   if (Bars == BarsOnChart)
   return(false);
   BarsOnChart = Bars;
   return(true);
}

void CheckForMeTrade() {
   double PreviousFast = iMA(NULL, 0, FastME, FastMEShift, FastMEMethod, FastMEAppliedTo, 2);
   double CurrentFast = iMA(NULL, 0, FastME, FastMEShift, FastMEMethod, FastMEAppliedTo, 1);
   double PreviousSlow = iMA(NULL, 0, SlowME, SlowMEShift, SlowMEMethod, SlowMEAppliedTo, 2);
   double CurrentSlow = iMA(NULL, 0, SlowME, SlowMEShift, SlowMEMethod, SlowMEAppliedTo, 1);
   if (PreviousFast < PreviousSlow && CurrentFast > CurrentSlow) OrderEntry(0);
   if (PreviousFast > PreviousSlow && CurrentFast < CurrentSlow) OrderEntry(1);
}

void OrderEntry(int direction) {
   if (direction == 0)
      if (OpenOrdersThisPair(Symbol()) == 0)
         OrderSend(Symbol(), OP_BUY, LotSize, Ask, 3, Ask-(StopLoss*pips), Ask+(TakeProfit*pips), NULL, MagicNumber, 0, clrGreen);
   if (direction == 1)
      if (OpenOrdersThisPair(Symbol()) == 0)
         OrderSend(Symbol(), OP_SELL, LotSize, Bid, 3, Bid+(StopLoss*pips), Bid-(TakeProfit*pips), NULL, MagicNumber, 0, clrRed);

}

int OpenOrdersThisPair(string pair) {
   int total = 0;
   for (int i = OrdersTotal() - 1; i >= 0; i --)
      if (OrderSelect(i , SELECT_BY_POS, MODE_TRADES))
         if (OrderSymbol() == pair) total++;
   return(total);
}
-- Dodano: 05 wrz 2018, 03:06 --

:568:

-- Dodano: 05 wrz 2018, 07:01 --

Nie chcę mieszać ale coś Ci pokaże. To jest EA pod jforex. Otwiera BUY jeśli poprzednia H4 jest wzrostowa, SELL gdy jest spadkowa. Następnie przesuwa SL nad high albo pod low 2 świece H4 wstecz. Wyjściowe SL ustawia na podstawie poprzedniej H4. Wyniki z testu historycznego, nawet daje radę https://images92.fotosik.pl/31/f7ea2285be7b2272.png

Kod: Zaznacz cały

package jforex;

import java.util.*;

import com.dukascopy.api.*;

import com.dukascopy.api.IEngine.OrderCommand;

public class Strategy_01092018_betaTestyAgain135 implements IStrategy {
    private IEngine engine;
    private IConsole console;
    private IHistory history;
    private IContext context;
    private IIndicators indicators;
    private IUserInterface userInterface;
    private IOrder order;
    
    public OfferSide side = OfferSide.BID;
    
    private int counter = 0;
    
    public void onStart(IContext context) throws JFException {
        this.engine = context.getEngine();
        this.console = context.getConsole();
        this.history = context.getHistory();
        this.context = context;
        this.indicators = context.getIndicators();
        this.userInterface = context.getUserInterface();  
    }

    public void onAccount(IAccount account) throws JFException {}

    public void onMessage(IMessage message) throws JFException {}

    public void onStop() throws JFException {}

    public void onTick(Instrument instrument, ITick tick) throws JFException {}
    
    public void onBar(Instrument instrument, Period period, IBar askBar, IBar bidBar) throws JFException {
        
        IBar prevH42 = history.getBar(instrument, Period.FOUR_HOURS, side, 2);
        IBar prevH4 = history.getBar(instrument, Period.FOUR_HOURS, side, 1);
        
        if (period.equals(Period.FOUR_HOURS)) {
            if (isBullBar(prevH4)) {
                sendOrder(instrument, OrderCommand.BUY, prevH4.getLow());
            } else {
                sendOrder(instrument, OrderCommand.SELL, prevH4.getHigh());            
            }
        }
        
        if (period.equals(Period.FOUR_HOURS)) {
            moveStopLoss(instrument, prevH42);
        }
        
    }

    public boolean isBullBar(IBar bar) {
        boolean res = (bar.getOpen() > bar.getClose()) ? false : true; return res;
    }
    
    public void sendOrder(Instrument instrument, OrderCommand cmd, double sl) throws JFException {
        if (engine.getOrders(instrument).size() > 0) return;
        double slPrice, tpPrice;
        boolean isLong = cmd == OrderCommand.BUY ? true : false;
        if (isLong) {
            slPrice = sl - 1 * instrument.getPipValue();
        } else {
            slPrice = sl + 1 * instrument.getPipValue();
        }
        engine.submitOrder(getLabel(instrument), instrument, cmd, 0.001, 0, 0, slPrice, 0);
    }
    
    public void moveStopLoss(Instrument instrument, IBar bar) throws JFException {
        if (engine.getOrders(instrument).size() == 0) return;
        for (IOrder order : engine.getOrders(instrument)) {
            if (order.getProfitLossInPips() > 0) {
                if (order.getOrderCommand() == OrderCommand.BUY) {
                    order.setStopLossPrice(bar.getLow());
                } else if (order.getOrderCommand() == OrderCommand.SELL) {
                    order.setStopLossPrice(bar.getHigh());
                }
            }
        }
    }
    
    protected String getLabel(Instrument instrument) {
        String label = instrument.name();
        label = label + System.currentTimeMillis() + Integer.toString(counter);
        counter++;
        return label;
    }
    
    public void print(Object o) {console.getOut().println(o);}
    
}
To będzie zadanie na przyszłość - zrób takie EA pod MT4 :wink:

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 »

A to ciekawe postaram się coś takiego zrobić bo wydaje się to w miarę proste logicznie. Wydaje mi się że uzyskałem od was wszystkie informacje które będą potrzebne do zrobienia tego i część zobaczyłem na MQL od kuchni więc teraz jakoś to połączyć. Możesz podesłać jakąś dobrą książkę z MQL ? poczytał bym coś popatrzył na przykłady i w taki sposób chyba najlepiej się tego poduczę. EA które obmyśliłem a które zrobiłeś całkiem nieźle sobie radzi. Bo zyski są nawet i ilość trafnych pozycji mnie mega zaskakuje. Ale muszę je dopracować bardziej bo niestety często wywala na Trailing Stopie i nie zgarnia sporej części zysków które teoretycznie były by do zgarnięcia. Test od 01.01.18 pokazuje że 71.9 % mam pozycji zyskownych. Ale to w sumie tylko jedna pozycja dziennie więc może nie należy oczekiwać mega zysków :) https://www.fotosik.pl/zdjecie/pelne/30b35414cdd52834
Poza tym musiał bym to bardziej sprawdzić nie mogę pobrać wcześniejszych danych u brokera. Ba do tego w ciągu roku zrobił tylko 178 trejdów a powinno być ponad 200. Zapewne problem tkwi w tym że w piątki zostawia pozycję na weekend gdyż kwotowania mam tylko do 22:59 ale w sumie zaraz to zmienię i sprawdzę.

No i zauważyłem coś co mnie strasznie irytuje w tym testerze strategi. Nie wiem czy robię coś źle czy to jakiś bug bo jeśli zmieniam w kodzie jakieś tam dane i odpalam to w testerze te dane nie zawsze są zmieniane, Muszę zamknąć wszystko odpalić od nowa i dopiero wtedy to rusza ... A czasami nawet i to nie pomaga tylko muszę zrobić nowe EA ze zmienionymi parametrami.

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

1. Nie znam żadnej książki o MQL, ale te artykuły co podał grzesq są dobre https://www.mql5.com/en/articles/mt4

2. Zrób warunek w onTick coś takiego https://docs.mql4.com/dateandtime/dayofweek

Kod: Zaznacz cały

void OnTick()
{
	   // twoj kod 
	   // cos tam jeszcze
	  
	   // Day of week 5 to piątek. W piątek o 23:55 zamknij wszystko albo zrób coś 
	   if (DayOfWeek() == 5) {
	   	   if (Hour() == 23 && Minute() == 55) {
	           // zamknij pozycje albo zrób coś
	   	   	   manuallyCloseOrder();
	   	   }	
	   }
}
3. A zatrzymujesz tester, następnie po zmianach w kodzie kompilujesz jeszcze raz strategie i dopiero odpalasz od nowa wciskając Start? Bo w testerze wszystko jest OK, ale jak włączysz live te EA to właśnie po zmianach ma zapisane u mnie poprzednie ustawienia. Też nie wiem dlaczego tak jest.

-- Dodano: 05 wrz 2018, 08:44 --

Sorry, Nie 23:55, tylko 22:55 !!!

-- Dodano: 05 wrz 2018, 10:11 --

Z formacji świecowych zakoduj taką sekwencje i sprawdź kiedyś pierwsza świeca jest wzrostowa, kolejna to doji, i następna będzie spadkowa, otwierasz na OPEN tej trzeciej świecy zamykasz na CLOSE. Nie wazny interwal, to może być H1, H4, D1, M15, M5. szukasz tej sekwencji dwóch pierwszych świec na każdym interwale, istotna jest świeca doji, to jest sygnał i potem grasz 3 świece ja miałeś tutaj wzostowa - potem doji - to sell https://images92.fotosik.pl/31/608883af62522a3b.png . Zrób kiedyś test tego.

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 »

Zeby zamykał zlecenia po Magic number powinno wyglądać to tak prawda ?
void manuallyCloseOrder()
{
for(int i=OrdersTotal(); i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS)==true)
{
{
if(OrderMagicNumber()==MagicNumber)
{
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);
}
}
}
}
}
Ale czy przypadkiem nie powinienem również zmienić kodu odpowiedzialnego za trailing stopa ?

Kod: Zaznacz cały

for(int i=OrdersTotal(); i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS)==true) 
{
if(OrderMagicNumber()==MagicNumber)
   {
   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);
               }
            }
      }
   }
}    
}   
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- »

1. Ok, wpiszmy w google https://www.google.com/search?q=magic+n ... refox-b-ab
2. Ok, jest jakiś artykuł https://www.mql5.com/en/articles/1359
3. W jaki sposób sprawdzają czy magic number jest ten który ma być

Kod: Zaznacz cały

//---- if the MagicNumber is not equal to the Expert_ID, skip this position
        if ( OrderMagicNumber() != Expert_ID ) continue;
4. Ty użyłeś if(OrderMagicNumber()==MagicNumber) czyli jeśli równanie jest spełnione i zwraca TRUE wtedy przejdź dalej, kod u góry ma przeskoczyć pętle CONTINUE jeśli magic number nie jest taki sam jak Expert_ID czyli zdefiniowany u góry w globalnej zmiennej z której wysyłany jest w zleceniach. Efekt jest taki sam, albo jest równy i wykonuje dalej program albo nie i go przerywa albo przeskakuje dalej.
5. Tak, to jest potrzebne chyba wszędzie gdzie masz pętle gdzie chcesz coś zmienić w pozycjach for(int i=OrdersTotal(); i>=0; i--) edytować stop loss, albo zamknąć pozycje. Musisz sprawdzić na początku ten magic number i w obu kodach które teraz wrzuciłeś wszystko wygląda Ok. Sprawdzasz ten warunek na samym początku, zanim sprawdzasz typ zlecenia czy jest BUY 0 czy SELL 1 i to rozwiązałeś dobrze :clap:
6. Pytanie czy uzyskałeś efekt który chciałeś, czy te EA będą chodziły na kilku wykresach w różnych ustawieniach i będą zamykały pozycje tylko dla tego konkretnego magic number. Trzeba to po prostu teraz sprawdzić, włączyć kilka EA z małymi SL i TP, które otwierają co chwile pozycje na demo i zobaczyć czy zamykają te pozycje co trzeba. Trzeba zrobić testy w realu i ewentualnie dalej poprawić to co nie działa.

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

Odnośnie nauki konkretniejszego języka jak np java. Tutaj (http://www.java2s.com/Tutorials/Java/Sw ... JFrame.htm) jest niezła lista gotowego kodu, wystarczy skopiować i wkleić do pliku Main.java i odpalić najlepiej na eclipse, żeby nie kombinować z ("set path cmd javac" itp) :wink: Po lewej jest lista z menu, można przejrzeć i zobaczyć co da się z tego zbudować i jak. A jak ktoś nie wie jak się tym bawić, to najlepiej zainstalować eclipse (http://www.eclipse.org/) . Ja mam zainstalowane Eclipse IDE for Java EE Developers Oxygen.3a Release (4.7.3a) chyba stąd (https://www.eclipse.org/downloads/packa ... /oxygen/3a) . Można wywoływać w niektórych miejscach tego kodu System.out.println("test"); i w ten sposób zobaczyć co zwraca w danej funkcji albo w danej zmiennej... i się uczyć.

ODPOWIEDZ