Zlecenia w okreslonej odleglosci
Zlecenia w okreslonej odleglosci
Witam mam problem z dopisaniem do kodu składni która odpowiadała by za sprawdzanie naszych otwartych zleceń i blokowała otwieranie nowych zleceń w predefinowanej odległości x od najbliższego zlecenia. Pomoże mi ktoś.. Chociaż jakieś naprowadzenie Dzięki.
Re: Zlecenia w okreslonej odleglosci
Panowie dlaczego w moim prostym programie nie działa funkcja distance do służąca blokowaniu składania zleceń bliższych o x pkt.
Kod: Zaznacz cały
//+------------------------------------------------------------------+
//| ProsteEA.mq4 |
//| Copyright 2012, DevPort |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, DevPort"
#property link "http://www.metaquotes.net"
extern int TakeProfit = 20;
extern int StopLoss = 2000;
extern double Lots = 0.1;
extern int CustomPeriod = 1; // In Minutes: 1, 5, 15, 30, 60, 240, 1440
extern double Distance = 20;
extern int Ilosc_zlecen = 1;
int multiplier;
int BarCount;
int ticket;
int wszystkie_zlecenia;
bool a;
double wart_bezwzg;
double liczba;
double cena_teraz;
double Op(int s) {
return(iOpen(NULL, CustomPeriod, s));
}
double Cl(int s) {
return(iClose(NULL, CustomPeriod, s));
}
double Hi(int s) {
return(iHigh(NULL, CustomPeriod, s));
}
double Lo(int s) {
return(iLow(NULL, CustomPeriod, s));
}
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
if(Digits==3 || Digits==5) {
multiplier=10;
} else {
multiplier=1;
}
BarCount = Bars;
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start(){
//----
wszystkie_zlecenia=OrdersTotal();
if(wszystkie_zlecenia == 0)
{
Comment("Zlecen : ", OrdersTotal());
if(BarCount < Bars)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Hi(1),3,Ask-StopLoss*multiplier*Point,Ask+TakeProfit*multiplier*Point,"",16384,0,Green);
if(ticket>0){
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUYSTOP order opened : ",OrderOpenPrice());
}else Print("Error opening BUYSTOP order : ",GetLastError());
BarCount = Bars;
}
}
for( int p=0; p<wszystkie_zlecenia; p++)
{
if(OrderSelect(p,SELECT_BY_POS))
{
liczba = Ask - OrderOpenPrice();
wart_bezwzg = !MathAbs(liczba);
if( wart_bezwzg /Point > Distance* multiplier)
{
if(OrdersTotal() < Ilosc_zlecen)
{
Comment("Zlecen : ", OrdersTotal());
if(BarCount < Bars)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Hi(1),3,Ask-StopLoss*multiplier*Point,Ask+TakeProfit*multiplier*Point,"",16384,0,Green);
if(ticket>0){
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUYSTOP order opened : ",OrderOpenPrice());
}else Print("Error opening BUYSTOP order : ",GetLastError());
BarCount = Bars;
}
}
}
}
}
//----
return(0);
}
//+------------------------------------------------------------------+
Re: Zlecenia w okreslonej odleglosci
Zauważyłem 2 błędy.
Pierwszy, to korzystasz z funkcji OnStart(). W nowej wersji mql ta funkcja jest przeznaczona dla skryptów, które wykonują się tylko raz. Dlatego w Twoim kodzie wartość zmiennej liczba cały czas wynosi 0. Czyli po prostu musisz zmienić metodę On Start() na void OnTick() i usunąć z niej "return(0).
Drugi błąd to "!" przed wywołaniem funkcji MathAbs().
Trzeci błąd jest taki, że to będzie działać tylko przy 2 zleceniach. Jak chcesz mieć np. 3, to już 3. może wejść nawet w miejscu 2. zlecenia. Przykładowo:
Pierwsze zlecenie wchodzi na 1.30
Drugie zlecenie na 1.3021 (do tego miejsca wszystko działa ok)
Trzecie zlecenie też wchodzi na 1.3021, bo przy pierwszym obiegu pętli warunek jest spełniony (odległość OrderOpenPrice pierwszego zlecenia od Ask jest większa niż zadany Distance).
Jak chcesz, żeby działało dla dowolnej liczby zleceń, to musisz sprawdzać tylko ostatnie.
Wklejam kod działający poprawnie dla 2 zleceń:
Pierwszy, to korzystasz z funkcji OnStart(). W nowej wersji mql ta funkcja jest przeznaczona dla skryptów, które wykonują się tylko raz. Dlatego w Twoim kodzie wartość zmiennej liczba cały czas wynosi 0. Czyli po prostu musisz zmienić metodę On Start() na void OnTick() i usunąć z niej "return(0).
Drugi błąd to "!" przed wywołaniem funkcji MathAbs().
Trzeci błąd jest taki, że to będzie działać tylko przy 2 zleceniach. Jak chcesz mieć np. 3, to już 3. może wejść nawet w miejscu 2. zlecenia. Przykładowo:
Pierwsze zlecenie wchodzi na 1.30
Drugie zlecenie na 1.3021 (do tego miejsca wszystko działa ok)
Trzecie zlecenie też wchodzi na 1.3021, bo przy pierwszym obiegu pętli warunek jest spełniony (odległość OrderOpenPrice pierwszego zlecenia od Ask jest większa niż zadany Distance).
Jak chcesz, żeby działało dla dowolnej liczby zleceń, to musisz sprawdzać tylko ostatnie.
Wklejam kod działający poprawnie dla 2 zleceń:
Kod: Zaznacz cały
//+------------------------------------------------------------------+
//| ProsteEA.mq4 |
//| Copyright 2012, DevPort |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2012, DevPort"
#property link "http://www.metaquotes.net"
extern int TakeProfit = 20;
extern int StopLoss = 2000;
extern double Lots = 0.1;
extern int CustomPeriod = 1; // In Minutes: 1, 5, 15, 30, 60, 240, 1440
extern double Distance = 20;
extern int Ilosc_zlecen = 3;
int multiplier;
int BarCount;
int ticket;
int wszystkie_zlecenia;
bool a;
double wart_bezwzg;
double liczba;
double cena_teraz;
double Op(int s) {
return(iOpen(NULL, CustomPeriod, s));
}
double Cl(int s) {
return(iClose(NULL, CustomPeriod, s));
}
double Hi(int s) {
return(iHigh(NULL, CustomPeriod, s));
}
double Lo(int s) {
return(iLow(NULL, CustomPeriod, s));
}
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
if(Digits==3 || Digits==5) {
multiplier=10;
} else {
multiplier=1;
}
BarCount = Bars;
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
void OnTick(){
//----
wszystkie_zlecenia=OrdersTotal();
if(wszystkie_zlecenia == 0)
{
Comment("Zlecen : ", OrdersTotal());
if(BarCount < Bars)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Hi(1),3,Ask-StopLoss*multiplier*Point,Ask+TakeProfit*multiplier*Point,"",16384,0,Green);
if(ticket>0){
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUYSTOP order opened : ",OrderOpenPrice());
}else Print("Error opening BUYSTOP order : ",GetLastError());
BarCount = Bars;
}
}
for( int p=0; p<wszystkie_zlecenia; p++)
{
if(OrderSelect(p,SELECT_BY_POS))
{
liczba = Ask - OrderOpenPrice();
wart_bezwzg = MathAbs(liczba);
if( wart_bezwzg /Point > Distance* multiplier)
{
if(OrdersTotal() < Ilosc_zlecen)
{
Comment("Zlecen : ", OrdersTotal());
if(BarCount < Bars)
{
ticket=OrderSend(Symbol(),OP_BUY,Lots,Hi(1),3,Ask-StopLoss*multiplier*Point,Ask+TakeProfit*multiplier*Point,"",16384,0,Green);
if(ticket>0){
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)) Print("BUYSTOP order opened : ",OrderOpenPrice());
}else Print("Error opening BUYSTOP order : ",GetLastError());
BarCount = Bars;
}
}
}
}
}
//----
}
//+------------------------------------------------------------------+