Как кодировать? - страница 291

 

деталь последней свечи

Здравствуйте,

нужен индикатор, который бы показывал значение high, low, open & close последней свечи...

 
mladen:
Почему бы тогда не использовать трейлинг-стоп? Я имею в виду, что это будет делать почти 100% (почти) того, что делает ваша оригинальная идея, и это намного, намного проще в коде.

Дело в том, что (я не думаю, что сформулировал это правильно или не был прав на 100%) стопы (пока, во всяком случае) остаются неизменными на протяжении всей сделки. Как насчет такого подхода, когда две сделки открыты, код может проверить количество открытых ордеров, если оно больше 1 (в основном 2), то в обеих сделках тейк-профиты изменяются до определенной суммы, которая была выше, чем раньше. По сути, здесь происходит своего рода хеджирование.

Спасибо,

madmax3

 

[langtitle=pl]Proszę o pomoc w napisaniu EA działającego n[/langtitle]

[lang=pl]Witam czy bugł by ktoś mi to dopracować był rym wdzięczny : Chciałbym rzeby kupywał LevelRSIbuy=20; a sprzeawał jak dojdzie LevelRSIsell=80; i żeby dało się ustawiać pozostałe żeczy kt�re są pod extern int MagicNumber

#define SIGNAL_NONE 0

#define СИГНАЛ_ПОКУПАТЬ 1

#define СИГНАЛ_ПРОДАЖИ 2

#define SIGNAL_CLOSEBUY 3

#define SIGNAL_CLOSESELL 4

#property copyright "Expert Advisor Builder"

#property link "http://sufx.core.t3-ism.net/ExpertAdvisorBuilder/"

extern int MagicNumber = 0;

extern bool SignalMail = False;

extern bool EachTickMode = True;

extern double Lots = 0.1;

extern int Slippage = 1;

extern bool UseStopLoss = True;

extern int StopLoss = 10;

extern bool UseTakeProfit = True;

extern int TakeProfit = 5;

extern bool UseTrailingStop = False;

extern int TrailingStop = 30;

extern int LevelRSIbuy = 20;

extern int LevelRSIsell=80;

int BarCount;

int Current;

bool TickCheck = False;

//+------------------------------------------------------------------+

//| функция инициализации эксперта |

//+------------------------------------------------------------------+

int init() {

BarCount = Bars;

if (EachTickMode) Current = 0; else Current = 1;

return(0);

}

//+------------------------------------------------------------------+

//| функция деинициализации эксперта |

//+------------------------------------------------------------------+

int deinit() {

return(0);

}

//+------------------------------------------------------------------+

//| функция запуска эксперта |

//+------------------------------------------------------------------+

int start() {

int Order = SIGNAL_NONE;

int Total, Ticket;

double StopLossLevel, TakeProfitLevel;

if (EachTickMode && Bars != BarCount) TickCheck = False;

Total = OrdersTotal();

Order = SIGNAL_NONE;

//+------------------------------------------------------------------+

//| Начало переменной |

//+------------------------------------------------------------------+

double Var1 = iRSI("EURUSD", PERIOD_M1, 14, PRICE_OPEN, Current + 0);

double Buy1_1 = iRSI("EURUSD", PERIOD_M1, 14, PRICE_OPEN, Current + 0);

double Sell1_1 = iRSI("EURUSD", PERIOD_M1, 14, PRICE_OPEN, Current + 0);

//+------------------------------------------------------------------+

//| Конец переменной |

//+------------------------------------------------------------------+

//Проверка позиции

bool IsTrade = False;

for (int i = 0; i < Total; i ++) {

OrderSelect(i, SELECT_BY_POS, MODE_TRADES);

if(OrderType() <= OP_SELL && OrderSymbol() == Symbol()) {

IsTrade = True;

if(OrderType() == OP_BUY) {

//Close

//+------------------------------------------------------------------+

//| Сигнал Begin(Exit Buy)|

//+------------------------------------------------------------------+

//+------------------------------------------------------------------+

//| Сигнал Конец(Выход из покупки)|

//+------------------------------------------------------------------+

if (Order == SIGNAL_CLOSEBUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {

OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, MediumSeaGreen);

if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Close Buy");

if (!EachTickMode) BarCount = Bars;

IsTrade = False;

continue;

}

//Трейлинг-стоп

if(UseTrailingStop && TrailingStop > 0) {

if(Bid - OrderOpenPrice() > Point * TrailingStop) {

if(OrderStopLoss() < Bid - Point * TrailingStop) {

OrderModify(OrderTicket(), OrderOpenPrice(), Bid - Point * TrailingStop, OrderTakeProfit(), 0, MediumSeaGreen);

if (!EachTickMode) BarCount = Bars;

continue;

}

}

}

} else {

//Close

//+------------------------------------------------------------------+

//| Signal Begin(Exit Sell) | Сигнал на продажу.

//+------------------------------------------------------------------+

//+------------------------------------------------------------------+

//| Сигнал End(Exit Sell)|

//+------------------------------------------------------------------+

if (Order == SIGNAL_CLOSESELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {

OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, DarkOrange);

if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Close Sell");

if (!EachTickMode) BarCount = Bars;

IsTrade = False;

continue;

}

//Трейлинг-стоп

if(UseTrailingStop && TrailingStop > 0) {

if((OrderOpenPrice() - Ask) > (Point * TrailingStop)) {

if((OrderStopLoss() > (Ask + Point * TrailingStop)) || (OrderStopLoss() == 0)) {

OrderModify(OrderTicket(), OrderOpenPrice(), Ask + Point * TrailingStop, OrderTakeProfit(), 0, DarkOrange);

if (!EachTickMode) BarCount = Bars;

continue;

}

}

}

}

}

}

//+------------------------------------------------------------------+

//| Сигнал Begin(Entry)|

//+------------------------------------------------------------------+

если (False) Order = SIGNAL_BUY;

if (False) Order = SIGNAL_SELL;

//+------------------------------------------------------------------+

//| Сигнал Окончание |

//+------------------------------------------------------------------+

//Покупка

if (Order == SIGNAL_BUY && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {

if(!IsTrade) {

//Проверка свободной маржи

if (AccountFreeMargin() < (1000 * Lots)) {

Print("У нас нет денег. Свободная маржа = ", AccountFreeMargin());

return(0);

}

if (UseStopLoss) StopLossLevel = Ask - StopLoss * Point; else StopLossLevel = 0.0;

if (UseTakeProfit) TakeProfitLevel = Ask + TakeProfit * Point; else TakeProfitLevel = 0.0;

Ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, StopLossLevel, TakeProfitLevel, "Buy(#" + MagicNumber + ")", MagicNumber, 0, DodgerBlue);

if (Ticket > 0) {

if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {

Print("Открыт ордер BUY : ", OrderOpenPrice());

if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Ask, Digits) + " Open Buy");

} else {

Print("Ошибка открытия ордера BUY : ", GetLastError());

}

}

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

return(0);

}

}

//Продажа

if (Order == SIGNAL_SELL && ((EachTickMode && !TickCheck) || (!EachTickMode && (Bars != BarCount)))) {

if(!IsTrade) {

//Проверка свободной маржи

if (AccountFreeMargin() < (1000 * Lots)) {

Print("У нас нет денег. Свободная маржа = ", AccountFreeMargin());

return(0);

}

if (UseStopLoss) StopLossLevel = Bid + StopLoss * Point; else StopLossLevel = 0.0;

if (UseTakeProfit) TakeProfitLevel = Bid - TakeProfit * Point; else TakeProfitLevel = 0.0;

Ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, StopLossLevel, TakeProfitLevel, "Sell(#" + MagicNumber + ")", MagicNumber, 0, DeepPink);

if (Ticket > 0) {

if (OrderSelect(Ticket, SELECT_BY_TICKET, MODE_TRADES)) {

Print(" Открытордер SELL: ", OrderOpenPrice());

if (SignalMail) SendMail("[Signal Alert]", "[" + Symbol() + "] " + DoubleToStr(Bid, Digits) + " Open Sell");

} else {

Print("Ошибка открытия ордера SELL : ", GetLastError());

}

}

if (EachTickMode) TickCheck = True;

if (!EachTickMode) BarCount = Bars;

return(0);

}

}

if (!EachTickMode) BarCount = Bars;

return(0);

}

//+------------------------------------------------------------------+[/lang]

 

Я пытаюсь использовать этот код для увеличения тейк-профита открытых сделок (если у них две открытые сделки).

if(total>2)

if(OrderType()==OP_BUY)

OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);

if(OrderType()==OP_SELL)

OrderModify(OrderTicket(),OrderOpenPrice(),OrderStopLoss(),Ask+((TakeProfit+20)*Point),0,Blue);

total=OrdersTotal(); btw.

Я все еще не могу заставить его работать, есть какие-либо предложения?

Спасибо,

madmax3

 

Помогите ограничить количество ежедневных сделок до 1

Я новичок в программировании и мне нужна помощь в MQL4. Я изучил несколько руководств по программированию и понял, как открывать и закрывать сделки на основе моей торговой стратегии. Моя трудность заключается в ограничении количества ежедневных сделок до 1. Я хочу открывать не более 1 сделки в день (по времени сервера). Поэтому я хотел бы проверить открытые и закрытые ордера, чтобы узнать, был ли ордер открыт сегодня. Если ордер был открыт сегодня, то не открывать никаких дополнительных ордеров в этот день.

Пожалуйста, помогите.

 
Попробуйте сделать что-то вроде этого:
bool uniqueOnDay()

{

datetime startTime = iTime(NULL,PERIOD_D1,Time[0]);

datetime endTime = startTime+24*60*PERIOD_D1;

for (int i=OrdersHistoryTotal()-1; i>=0; i--)

{

if (!OrderSelect(i,SELECT_BY_POS,MODE_HISTORY)) continue;

if (OrderSymbol() != Symbol()) continue;

if (OrderMagicNumber() != MagicNumber) continue;

if (OrderOpenTime()endTime) continue;

return(false);

}

return(true);

}
Проверяется, был ли открыт какой-либо из закрытых ордеров по текущему символу в текущий день. Если в текущий день был открыт ордер, то возвращается false (в этот день уже был открыт ордер), иначе возвращается true (в этот день не было открыто ни одного ордера). Он не проверяет текущие открытые ордера (только историю), поскольку я предполагаю, что вам не нужно более 1 открытого ордера, а это проверяется по-другому. Использование будет примерно таким:

if (UniqueOnDay() && CurrentlyOpenedOrders==0) ...

PS: это предполагает, что у вашего советника есть параметр MagicNumber (именно такое название).

PPS: он будет работать на таймфреймах вплоть до дневного. Он не будет нормально работать на недельных и мотыльковых графиках.

dresolo1:
Я новичок в программировании и мне нужна помощь в MQL4. Я изучил несколько руководств по программированию и понял, как открывать и закрывать сделки на основе моей торговой стратегии. Моя трудность заключается в ограничении количества сделок в день до 1. Я хочу открывать не более 1 сделки в день (по времени сервера). Поэтому я хотел бы проверить открытые и закрытые ордера, чтобы узнать, был ли ордер открыт сегодня. Если ордер был открыт сегодня, то не открывать никаких дополнительных ордеров в этот день. Пожалуйста, помогите.
 

[langtitle=pl]Преобразование функции Tema в Tema(close,period)[/langtitle]

Witam

Jeszcze raz bo cos sie zle wkleilo. Jak przekazac wartosc funkcji Tema do Var1. Jak robie tak jak w kodzie ponizej to Var1 jest puste.

#property indicator_chart_window

#property indicator_buffers 1

#property indicator_color1 DarkBlue

#property indicator_width1 2

//---- input parameters

extern int EMA_period=4;

//---- buffers

string txt;

double TemaBuffer[];

double Ema[];

double EmaOfEma[];

double EmaOfEmaOfEma[];

double Var1;

int Var2;

int i,limit,limit2,limit3;

extern int Apply_To_Price=1;

//+------------------------------------------------------------------+

//| Custom indicator initialization function |

//+------------------------------------------------------------------+

int init()

{

//---- indicators

IndicatorBuffers(5);

SetIndexStyle(0,DRAW_LINE);

SetIndexBuffer(0,Var1);

SetIndexBuffer(1,TemaBuffer);

SetIndexBuffer(2,Ema);

SetIndexBuffer(3,EmaOfEma);

SetIndexBuffer(4,EmaOfEmaOfEma);

IndicatorShortName("TEMA("+EMA_period+")");

switch(Apply_To_Price)

{

case 1:

{txt="Open";break;}

case 2:

{txt="High";break;}

case 3:

{txt="Low"; break;}

case 4:

{txt="Median"; break;}

case 5:

{txt="Typical"; break;}

case 6:

{txt="WghtdClose"; break;}

default:

{txt="Close";}

}

//----

return(0);

}

//+------------------------------------------------------------------+

//| Custom indicator deinitialization function |

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| Custom indicator iteration function |

//+------------------------------------------------------------------+

int start()

{

//----

int counted_bars=IndicatorCounted();

if (counted_bars==0)

{

limit=Bars-1;

limit2=limit-EMA_period;

limit3=limit2-EMA_period;

}

if (counted_bars>0)

{

limit=Bars-counted_bars-1;

limit2=limit;

limit3=limit2;

}

for (i=limit3;i>=0;i--)

{

Var1 = Tema(Apply_To_Price,4); //=======================TUTAJ JEST PROBLEM W VAR1 NIC NIE MA. DLACZEGO?

// Alert(Var1);

}

Var2 = dodawanie (2,3);

return(0);

}

double Tema(int Cena, int cykl)

{

//----

for (i=limit;i>=0;i--) Ema=iMA(NULL,0,cykl,0,MODE_EMA,Cena,i);

for (i=limit2;i>=0;i--) EmaOfEma=iMAOnArray(Ema,0,cykl,0,MODE_EMA,i);

for (i=limit3;i>=0;i--) EmaOfEmaOfEma=iMAOnArray(EmaOfEma,0,cykl,0,MODE_EMA,i);

for (i=limit3;i>=0;i--)

{

TemaBuffer=3*Ema-3*EmaOfEma+EmaOfEmaOfEma;

//Alert(TemaBuffer);

}

return(TemaBuffer);

}

int dodawanie (int a, int b)

{

int c;

c=a+b;

return(c);

}

 

Например, вот так (TEMA) ...

Если вы хотите, чтобы это было как функция, то это должно быть что-то вроде этого:
double workTema[][3];

#define _ema1 0

#define _ema2 1

#define _ema3 2

double iTema(double price, double period, int r, int instanceNo=0)

{

if (ArrayRange(workTema,0)!= Bars) ArrayResize(workTema,Bars); instanceNo*=3; r = Bars-r-1;

//

//

//

//

//

double alpha = 2.0 / (1.0+period);

workTema[r][_ema1+instanceNo] = workTema[r-1][_ema1+instanceNo]+alpha*(price -workTema[r-1][_ema1+instanceNo]);

workTema[r][_ema2+instanceNo] = workTema[r-1][_ema2+instanceNo]+alpha*(workTema[r][_ema1+instanceNo]-workTema[r-1][_ema2+instanceNo]);

workTema[r][_ema3+instanceNo] = workTema[r-1][_ema3+instanceNo]+alpha*(workTema[r][_ema2+instanceNo]-workTema[r-1][_ema3+instanceNo]);

return(workTema[r][_ema3+instanceNo]+3.0*(workTema[r][_ema1+instanceNo]-workTema[r][_ema2+instanceNo]));

}[/PHP]

Прикрепляю пример индикатора. Преимущество передачи значения вместо типа цены в том, что таким образом можно применить tema к любому значению (это не обязательно должна быть tema цены, это может быть tema другого индикатора, например).

lukibest:
Witam

Jeszcze raz bo cos sie zle wkleilo. Jak przekazac wartosc funkcji Tema do Var1. Jak robie tak jak w kodzie ponizej to Var1 jest puste.

[PHP]

#property indicator_chart_window

#property indicator_buffers 1

#property indicator_color1 DarkBlue

#property indicator_width1 2

//---- входные параметры

extern int EMA_period=4;

//---- буферы

строка txt

double TemaBuffer[];

double Ema[];

double EmaOfEma[];

double EmaOfEmaOfEma[];

double Var1;

int Var2;

int i,limit,limit2,limit3;

extern int Apply_To_Price=1;

//+------------------------------------------------------------------+

//| Пользовательская функция инициализации индикатора |

//+------------------------------------------------------------------+

int init()

{

//---- индикаторы

IndicatorBuffers(5);

SetIndexStyle(0,DRAW_LINE);

SetIndexBuffer(0,Var1);

SetIndexBuffer(1,TemaBuffer);

SetIndexBuffer(2,Ema);

SetIndexBuffer(3,EmaOfEma);

SetIndexBuffer(4,EmaOfEmaOfEma);

IndicatorShortName("TEMA("+EMA_period+")");

switch(Apply_To_Price)

{

case 1:

{txt="Open";break;}

case 2:

{txt="High";break;}

case 3:

{txt="Low"; break;}

case 4:

{txt="Median"; break;}

case 5:

{txt="Typical"; break;}

case 6:

{txt="WghtdClose"; break;}

default:

{txt="Закрыть";}

}

//----

return(0);

}

//+------------------------------------------------------------------+

//| Пользовательская функция деинициализации индикатора |

//+------------------------------------------------------------------+

int deinit()

{

//----

//----

return(0);

}

//+------------------------------------------------------------------+

//| Пользовательская функция итерации индикатора |

//+------------------------------------------------------------------+

int start()

{

//----

int counted_bars=IndicatorCounted();

if (counted_bars==0)

{

limit=Bars-1;

limit2=limit-EMA_period;

limit3=limit2-EMA_period;

}

if (counted_bars>0)

{

limit=Bars-counted_bars-1;

limit2=limit;

limit3=limit2;

}

for (i=limit3;i>=0;i--)

{

Var1 = Tema(Apply_To_Price,4); //=======================TUTAJ JEST PROBLEM W VAR1 NIC NIE MA. DLACZEGO?

// Alert(Var1);

}

Var2 = dodawanie (2,3);

return(0);

}

double Tema(int Cena, int cykl)

{

//----

for (i=limit;i>=0;i--) Ema=iMA(NULL,0,cykl,0,MODE_EMA,Cena,i);

for (i=limit2;i>=0;i--) EmaOfEma=iMAOnArray(Ema,0,cykl,0,MODE_EMA,i);

for (i=limit3;i>=0;i--) EmaOfEmaOfEma=iMAOnArray(EmaOfEma,0,cykl,0,MODE_EMA,i);

for (i=limit3;i>=0;i--)

{

TemaBuffer=3*Ema-3*EmaOfEma+EmaOfEmaOfEma;

//Alert(TemaBuffer);

}

return(TemaBuffer);

}

int dodawanie (int a, int b)

{

int c;

c=a+b;

return(c);

}

Файлы:
tema.mq4  3 kb
 

Помогите с кодом HAMMER пожалуйста

Здравствуйте,

Я только начинаю работать в mql4. Пытаюсь выбрать черные и белые молоты в свечах с помощью следующего индикатора. Однако на графике иногда свечи имеют неправильную идентификацию (белая свеча молот идентифицируется как черная свеча молот и наоборот). Пожалуйста, помогите мне в этой ситуации, заранее спасибо.

#property indicator_chart_window

int limit;

//---- буферы

string hammer[200000];

//+------------------------------------------------------------------+

//| Функция инициализации индикатора CuStom |

//+------------------------------------------------------------------+

int init()

{

return(0);

}

//+------------------------------------------------------------------+

//| Функция деинициализации индикатора CuStor |

//+------------------------------------------------------------------+

int deinit()

{

//----

ObjectsDeleteAll(hammer,OBJ_TEXT);

//----

return(0);

}

//+------------------------------------------------------------------+

//| Итерационная функция индикатора CuStom |

//+------------------------------------------------------------------+

int start()

{

int N;

int N1;

int N2;

строковый текст;

int counted_bars=IndicatorCounted();

limit=Считанные_бары;

for(N = 1; N < limit; N++) {

hammer[N]= CharToStr(N);

N1 = N + 1;

N2 = N + 2;

//----

//---- проверка на возможные ошибки

if(counted_bars<0) {

Alert("NO Bars...");

return(-1);

}

// Проверяем наличие белого молота

if ((((Close[N1]>Open[N1]) && ((Open[N1]-Low[N1])>=2*(Close[N1]-Open[N1])) && ((High[N1]-Close[N1])<=(Open[N1]-Low[N1])*0.10)))) {

ObjectCreate(hammer[N], OBJ_TEXT, 0, Time[N1], Low[N1] - Point);

ObjectSetText(hammer[N], "WHmr", 9, "Times New Roman", LawnGreen);

}

// Проверка наличия черного молотка

if (((Close[N1]=2*(Open[N1]-Close[N1])) && ((High[N1]-Open[N1])<=(Close[N1]-Low[N1])*0.10))) {

ObjectCreate(hammer[N], OBJ_TEXT, 0, Time[N1], Low[N1] - Point);

ObjectSetText(hammer[N], "BHmr", 9, "Times New Roman", LawnGreen);

}

//----

} // Конец цикла for

return(0);

}

//+------------------------------------------------------------------+

 
svezir:
Здравствуйте,

Я только начинаю работать в mql4. Пытаюсь выбрать черные и белые молоты в свечах с помощью следующего индикатора. Однако на графике иногда свечи имеют неправильную идентификацию (свеча белый молот идентифицируется как свеча черный молот и наоборот). Пожалуйста, помогите мне в этой ситуации, заранее спасибо.

#property indicator_chart_window

int limit;

//---- буферы

string hammer[200000];

//+------------------------------------------------------------------+

//| Функция инициализации индикатора CuStom |

//+------------------------------------------------------------------+

int init()

{

return(0);

}

//+------------------------------------------------------------------+

//| Функция деинициализации индикатора CuStor |

//+------------------------------------------------------------------+

int deinit()

{

//----

ObjectsDeleteAll(hammer,OBJ_TEXT);

//----

return(0);

}

//+------------------------------------------------------------------+

//| Итерационная функция индикатора CuStom |

//+------------------------------------------------------------------+

int start()

{

int N;

int N1;

int N2;

строковый текст;

int counted_bars=IndicatorCounted();

limit=Считанные_бары;

for(N = 1; N < limit; N++) {

hammer[N]= CharToStr(N);

N1 = N + 1;

N2 = N + 2;

//----

//---- проверка на возможные ошибки

if(counted_bars<0) {

Alert("NO Bars...");

return(-1);

}

// Проверяем наличие белого молота

if ((((Close[N1]>Open[N1]) && ((Open[N1]-Low[N1])>=2*(Close[N1]-Open[N1])) && ((High[N1]-Close[N1])<=(Open[N1]-Low[N1])*0.10)))) {

ObjectCreate(hammer[N], OBJ_TEXT, 0, Time[N1], Low[N1] - Point);

ObjectSetText(hammer[N], "WHmr", 9, "Times New Roman", LawnGreen);

}

// Проверка наличия черного молотка

if (((Close[N1]=2*(Open[N1]-Close[N1])) && ((High[N1]-Open[N1])<=(Close[N1]-Low[N1])*0.10))) {

ObjectCreate(hammer[N], OBJ_TEXT, 0, Time[N1], Low[N1] - Point);

ObjectSetText(hammer[N], "BHmr", 9, "Times New Roman", LawnGreen);

}

//----

} // Конец цикла for

return(0);

}

//+------------------------------------------------------------------+

Привет, Свезир,

У меня есть этот индикатор для свечных паттернов, может он поможет.