//+------------------------------------------------------------------+
//| ZigZag.mq5 |
//| Copyright 2010, AM2 Group. |
//| http://www.am2_group.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2010, AM2 Group."
#property link "http://www.am2_group.net"
#property version "1.00"
#include <Trade\Trade.mqh>
//--- входные параметры
input int TakeProfit= 20; // Take Profit
input int StopLoss = 100; // Stop Loss
input string ZigZag="Параметры ZigZag";
input int ExtDepth=13;
input int ExtDeviation=5;
input int ExtBackstep=3;
input int EA_Magic=26062010; // Magic Number советника
input double Lot=1; // Количество лотов для торговли
//--- глобальные переменные
int zzHandle; // хэндл индикатора ZigZag
double zzVal[]; // динамические массивы для хранения численных значений индикатора ZigZag
int STP, TKP; // будут использованы для значений Stop Loss и Take Profit
double zz[2]={0,0},delta=0,sigma=0,zz1=0,zz2=0;// значения 1-го и 2-го зигзага
bool bone=true, sone=true;
CTrade trade;
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- Получить хэндл индикатора ZigZag
zzHandle=iCustom(NULL,0,"ZigZag",ExtDepth,ExtDeviation,ExtBackstep,0,PRICE_CLOSE); //Расчет индикатора ZigZag
//--- Нужно проверить, не были ли возвращены значения Invalid Handle
if(zzHandle<0)
{
Alert("Ошибка при создании индикаторов - номер ошибки: ",GetLastError(),"!!");
}
//--- Для работы с брокерами, использующими 3-х и 5-ти значные котировки,
//--- умножаем на 10 значения SL и TP
STP = StopLoss;
TKP = TakeProfit;
if(_Digits==5 || _Digits==3)
{
STP = STP*10;
TKP = TKP*10;
}
//---
return(0);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//---
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//--- Объявляем структуры, которые будут использоваться для торговли
ArraySetAsSeries(zzVal,true);
int copied=CopyBuffer(zzHandle,0,0,100,zzVal);
if(copied<=0)
{
Print("Не удалось скопировать значения индикатора. Error =",GetLastError());
return;
}
// Ищем ближайший экстремум
int a=0;
for (int i=1;i<100;i++)
{
if (zzVal[i]!=0)
{
if(a<2)
{
zz[a]=zzVal[i];
a++;
}
}
}
//---
zz1=zz[0];
zz2=zz[1];
delta=(zz1+zz2)/2;
sigma=NormalizeDouble(MathAbs(zz1-zz2),_Digits);
double Ask = SymbolInfoDouble(_Symbol,SYMBOL_ASK); // лучшее предложение на покупку
double Bid = SymbolInfoDouble(_Symbol,SYMBOL_BID); // лучшее предложение на продажу
//--- check signals
ENUM_ORDER_TYPE signal=WRONG_VALUE;
if(Bid<=delta && zz1>zz2 && sone && sigma>0.00500) signal=ORDER_TYPE_SELL; // sell conditions
else
if(Ask>=delta && zz1<zz2 && bone && sigma>0.00500) signal=ORDER_TYPE_BUY; // buy conditions
if(signal==ORDER_TYPE_BUY)
{
if(!PositionSelect(_Symbol)) // цена растет
{
trade.PositionOpen(_Symbol,signal,1,Ask,0,NormalizeDouble(Ask + TKP*_Point,_Digits)," ");
bone=false;
sone=true;
}
}
if(signal==ORDER_TYPE_SELL)
{
if(!PositionSelect(_Symbol)) // цена убывает
{
trade.PositionOpen(_Symbol,signal,1,Bid,0,NormalizeDouble(Bid - TKP*_Point,_Digits)," ");
sone=false;
bone=true;
}
}
}
//+------------------------------------------------------------------+
А я не успел еще толком пощупать 5-ку. Чемп в этом году пропускаю, наверное [
2010.07.29 19:23
1. Copy
experts\expert.ex5 ok
2. Compile
3. Configuration
expert on EURUSD: D1 every tick 2010.01.01-2010.08.01
4. Start
finished in 1 min 13 sec
5. Statistics
640 kb of log files
24 trades, 48 deals, profit 24863.06 USD
No errors!
championship.mql5.com/2010/ru/users/bobsley/discussion/page13
AM2