Poszukuję kogoś kto zrobił by dla mnie prosty automat
Re: Poszukuję kogoś kto zrobił by dla mnie prosty automat
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.
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.
Re: Poszukuję kogoś kto zrobił by dla mnie prosty automat
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
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
Re: Poszukuję kogoś kto zrobił by dla mnie prosty automat
--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.
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.
Re: Poszukuję kogoś kto zrobił by dla mnie prosty automat
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:)
Możliwe że jest to starsza wersja i niektóre funkcje zostały zastąpione:)
Re: Poszukuję kogoś kto zrobił by dla mnie prosty automat
Masz wyjaśnione w nagraniu s01e07 jak te magic number ustawić, tak od 35 min.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:)
-- 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 );
}
-- 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 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, 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);}
}
Re: Poszukuję kogoś kto zrobił by dla mnie prosty automat
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.
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.
Re: Poszukuję kogoś kto zrobił by dla mnie prosty automat
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
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.
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();
}
}
}
-- 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.
Re: Poszukuję kogoś kto zrobił by dla mnie prosty automat
Zeby zamykał zlecenia po Magic number powinno wyglądać to tak prawda ?
Dobrze to zrobiłem ?
Ale czy przypadkiem nie powinienem również zmienić kodu odpowiedzialnego za trailing stopa ?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);
}
}
}
}
}
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);
}
}
}
}
}
}
Re: Poszukuję kogoś kto zrobił by dla mnie prosty automat
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ć
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
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.
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;
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
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.
Re: Poszukuję kogoś kto zrobił by dla mnie prosty automat
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) 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ć.