Czy ktoś może mi zmienić te EA tak żeby działało tak jak napisałem w poście na górze.
Kod: Zaznacz cały
//+------------------------------------------------------------------+
//| Buyzone.mq4 |
//| Copyright © 2009, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
// gdy zamknij=0 to owiera nowe zlecenie dopiero gdy poprzednie złapie TP lub SL
// zamiast zlecen oczekujących zlecenia bezpośrednie
#property copyright "Copyright © 2009, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"
#include <stdlib.mqh>
#include <WinUser32.mqh>
extern int Hstart=16; // godzina rozpoczęcia handlu
extern int Mstart=0; // minuta rozpoczęcia handlu
extern int Hstop=16; // godzina zakonczenia handlu czyli EA po tej godzinie nie ustawia nowych zleceń ale obsługuje bieżace
extern int Mstop=20; // minuta zakonczenia handlu
extern int entry=6;
extern int TP=30;
extern int SL=10;
extern int slippage=2;
extern int BreakEven=0; // jeśli 0 BE wyłączony, jesli inna wartość tzn. żę po tylu zarobionych pisach przesun SL na poziom otwarcia
extern int TrailingStop=0; // jeśli 0 TS wyłączony, jaki SL przy trailignu
extern int TrailingStep=0; // co ile pisów przesuwac SL
extern int TrailingActive=0; // ile pipsów zysku żeby uaktywnic TS
extern double mnoznikTS=1;
extern int zamykaj=1; // 0 nie zamykaj czeka na SL lub TP, 1 zamykaj po godzinie, 2 nie ustawiaj TP tylko zamykaj po godzine
extern bool onlytrend=false;
//bool logi=true;
extern double min_lot=0.1; // minimalna wielkość lota
extern double mnoznikLOT=1; // mnożnik
extern int licz_profit=5; // do której transakcji zyskownej podrząd mnożyć wielkość lota
double spread;
int tiket;
datetime Htiket; // czas ustawienia zlecenia
int Ntiket; // liczba zyskownych transkacji pod rząd
int result; //
double lot;
double tmp;
double mnozTrailingStop; // przemnożony trailingstop
bool aktywnyTS; // tzn czy trailig się uaktywnił
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
//----
spread =MarketInfo(Symbol(), MODE_SPREAD);
lot=min_lot;
tmp=Time[0];// zapamiętuje czas świecy aby zaczyać dopiero od nas następnej świecy
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
//----
//----
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
if ((Time[0]+Period()*60-60<=TimeCurrent()) && (tiket>0)) ///zamyka w ostatniej minucie swiecy
{
// zamyka zlecenia z poprzedniej godziny
if (zamykaj!=0)
{ OrderSelect(tiket,SELECT_BY_TICKET);
if (OrderType()==OP_BUY)
result=OrderClose(tiket,lot,Bid,slippage,CLR_NONE);
else
result=OrderClose(tiket,lot,Ask,slippage,CLR_NONE);
}
}
if ((TimeCurrent()>=StrToTime(Hstart+":"+Mstart)) && (TimeCurrent()<=StrToTime(Hstop+":"+Mstop)) && (tiket<1) && (tmp!=Time[0]))
// tzn, że zaczęła się nowa świeca tymczasowe rozwiązanie do testów
{
if ( Bid>=Open[0] +entry * Point) /// czyli poszło w góre
//if ( Ask>=Open[0] +(entry + spread)*Point) /// czyli poszło w góre
{
if ((onlytrend==false) || (Open[1]<Close[1]))
{
if ((zamykaj==2) || (TP==0)) // ustaw zlecenie bez TP
{ tiket= OrderSend(Symbol(), OP_BUY, lot, Ask , slippage, Ask - SL*Point, 0, "BZone1.14", 1024, 0, CLR_NONE ); }
else
{ tiket= OrderSend(Symbol(), OP_BUY, lot, Ask , slippage, Ask - SL*Point, Ask + TP*Point, "BZone1.14", 1024, 0, CLR_NONE ); }
if (tiket<1)
{ int error=GetLastError();
Comment(ErrorDescription(error));
// if (logi==true) { FileWrite(uchwyt,TimeHour(TimeCurrent())+":"+TimeMinute(TimeCurrent())+":"+TimeSeconds(TimeCurrent())+" "+ErrorDescription(error));
}
else
{
Htiket=TimeCurrent(); // zapisuje czas ustawienia zleceń
aktywnyTS=false;
mnozTrailingStop=TrailingStop;
}
}
}
if ( Bid<=Open[0] -entry*Point) /// czyli poszło w doł
{
if ((onlytrend==false) || (Open[1]>Close[1]))
{
if ((zamykaj==2) || (TP==0)) // ustaw zlecenie bez TP
{tiket= OrderSend(Symbol(), OP_SELL, lot,Bid , slippage, Bid+SL*Point, 0, "BZone1.14", 1024, 0, CLR_NONE ); }
else
{tiket= OrderSend(Symbol(), OP_SELL, lot, Bid , slippage, Bid+SL*Point ,Bid-TP*Point ,"BZone1.14", 1024, 0, CLR_NONE ); }
if (tiket<1)
{ int error1=GetLastError();
Comment(ErrorDescription(error1));
}
else
{
Htiket=TimeCurrent(); // zapisuje czas ustawienia zleceń
aktywnyTS=false;
mnozTrailingStop=TrailingStop;
}
}
}
}
else
{
if (tiket>0)
{ OrderSelect(tiket,SELECT_BY_TICKET);
if (OrderCloseTime()!=0) // sprawdz czy jest zrealizowane
{ tiket=0;
tmp=Time[0]; // tymczasowe rozwiązanie tylko do testów / zapamiętuje na której świecy złapał SL lub TP
if (OrderProfit()>0) // jesli zysk
{ Ntiket++;
if (Ntiket<=licz_profit)
{ if (MarketInfo(Symbol(),MODE_LOTSTEP)==0.01)
lot=NormalizeDouble(lot*mnoznikLOT,2);
else
lot=NormalizeDouble(lot*mnoznikLOT,1);
}
}
else // czyli strata
{Ntiket=0;
lot=min_lot;
}
}
else // czyli weszło ale nie jest zrealizowane
{
if (TrailingStop!=0) trailing(); // uawtywnia trailing stopa i obsługuje go
if (BreakEven!=0) // tzn że trzeba ustawić przesunąc Sl na poziom wejscia
{
if ((OrderType()==OP_BUY) && (OrderOpenPrice()>OrderStopLoss()))
{
if (Bid-OrderOpenPrice()>=BreakEven*Point) // zysk jest większy od breakeven
OrderModify(tiket,0,OrderOpenPrice(),OrderTakeProfit(),0,0);
}
if ((OrderType()==OP_SELL) && (OrderOpenPrice()<OrderStopLoss()))
{
if (OrderOpenPrice()-Ask>=BreakEven*Point) // zysk jest większy od breakeven
OrderModify(tiket,0,OrderOpenPrice(),OrderTakeProfit(),0,0);
}
}
}
}
}
return(0);
}
//+------------------------------------------------------------------+
int trailing()
{ OrderSelect(tiket,SELECT_BY_TICKET);
if (aktywnyTS==false) // tzn że TS jeszcze się nie uaktywnił i trzeba go teraz ustawić
{ if (OrderType()==OP_BUY) // zlecenie kupna
{ if (Bid-OrderOpenPrice()>=TrailingActive*Point) /// jesli zysk większy lun równy od tralActiv
{ OrderModify(tiket,0,Bid-mnozTrailingStop*Point,OrderTakeProfit(),0,0);
aktywnyTS=true;
}
}
else
{ if (OrderOpenPrice()-Ask>=TrailingActive*Point) /// jesli zysk większy lun równy od tralActiv
{ OrderModify(tiket,0,Ask+mnozTrailingStop*Point,OrderTakeProfit(),0,0);
aktywnyTS=true;
}
}
}
else
{ if (OrderType()==OP_BUY) // zlecenie kupna
{ if (Bid-OrderStopLoss()>=(mnozTrailingStop+TrailingStep)*Point) // czyli kurs wzrosł o trailingstep i trzeba przesunąc SL
{ mnozTrailingStop=NormalizeDouble(mnozTrailingStop*mnoznikTS,0);
if (MarketInfo(Symbol(), MODE_STOPLEVEL)>mnozTrailingStop) mnozTrailingStop=MarketInfo(Symbol(), MODE_STOPLEVEL);
OrderModify(tiket,0,Bid-mnozTrailingStop*Point,OrderTakeProfit(),0,0);
}
}
else
{ if (OrderStopLoss()-Ask>=(mnozTrailingStop+TrailingStep)*Point) // czyli kurs spoadł o trailingstep i trzeba przesunąc SL
{ mnozTrailingStop=NormalizeDouble(mnozTrailingStop*mnoznikTS,0);
if (MarketInfo(Symbol(), MODE_STOPLEVEL)>mnozTrailingStop) mnozTrailingStop=MarketInfo(Symbol(), MODE_STOPLEVEL);
OrderModify(tiket,0,Ask+mnozTrailingStop*Point,OrderTakeProfit(),0,0);
}
}
}
}