
//+------------------------------------------------------------------+
//| WO.mq5 |
//| Copyright 2016, AM2 |
//| http://www.forexsystems.biz |
//+------------------------------------------------------------------+
#property copyright "Copyright 2015, AM2"
#property link "http://www.forexsystems.biz"
#property version "1.02"
#include <Trade\Trade.mqh> // Подключаем торговый класс CTrade
#include <SmoothAlgorithms.mqh>
//--- входные параметры эксперта
input int TP = 1111; // Тейкпрофит
input int SL = 1111; // Стоплосс
input int BULevel = 200; // Уровень БУ
input int BUPoint = 20; // Пункты БУ
input int Slip = 50; // Проскальзывание
input double Lot = 1; // Количество лотов для торговли
//--- входные параметры индикатора MA
input int MAPeriod=28; // Период MA
//+-----------------------------------------------+
//| ВХОДНЫЕ ПАРАМЕТРЫ ИНДИКАТОРА WO |
//+-----------------------------------------------+
//---- Параметры RSI
input double RSIWeight=1.0;
input uint RSIPeriod=14;
input ENUM_APPLIED_PRICE RSIPrice=PRICE_CLOSE;
//---- Параметры MFI
input double MFIWeight=1.0;
input uint MFIPeriod=14;
input ENUM_APPLIED_VOLUME MFIVolumeType=VOLUME_TICK;
//---- Параметры WPR
input double WPRWeight=1.0;
input uint WPRPeriod=14;
//---- Параметры DeMarker
input double DeMarkerWeight=1.0;
input uint DeMarkerPeriod=14;
//---- Включение сглаживания волны
input Smooth_Method bMA_Method=MODE_JJMA; //метод усреднения
input uint bLength=5; //глубина сглаживания
input int bPhase=100; //параметр сглаживания,
//---- для JJMA изменяющийся в пределах -100 ... +100, влияет на качество переходного процесса;
//---- Для VIDIA это период CMO, для AMA это период медленной скользящей
input uint HighLevel=70; // уровень перезакупа
input uint LowLevel=30; // уровень перепроданности
//WOHandle=iCustom(NULL,0,"WeightOscillator",RSIWeight,RSIPeriod,RSIPrice,MFIWeight,MFIPeriod,WPRWeight,WPRPeriod,DeMarkerWeight,DeMarkerPeriod,bMA_Method,bLength,bPhase,HighLevel,LowLevel);
//--- глобальные переменные
int MAHandle; // Хэндл индикатора MA
int WOHandle; // Хэндл индикатора WO
double WO[3],MA[1]; // Динамические массивы для хранения численных значений индикаторов
CTrade trade; // Используем торговый класс CTrade
//+------------------------------------------------------------------+
//| Expert initialization function |
//+------------------------------------------------------------------+
int OnInit()
{
//--- Получаем хэндл индикаторов Bollinger Bands
MAHandle=iMA(NULL,0,MAPeriod,0,0,0);
WOHandle=iCustom(NULL,0,"WeightOscillator");
return(INIT_SUCCEEDED);
}
//+------------------------------------------------------------------+
//| Expert deinitialization function |
//+------------------------------------------------------------------+
void OnDeinit(const int reason)
{
//--- освобождаем хэндл индикатора
IndicatorRelease(MAHandle);
IndicatorRelease(WOHandle);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void BU()
{
// Лучшее предложение на покупку
double Ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
// Лучшее предложение на продажу
double Bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);
double sl=0,tp=0;
for(int i=PositionsTotal()-1;i>=0;i--)
{
if(PositionSelect(_Symbol))
{
if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
{
if(PositionGetDouble(POSITION_PRICE_OPEN)<=Bid-(BULevel+BUPoint)*_Point)
{
if(PositionGetDouble(POSITION_PRICE_OPEN)>PositionGetDouble(POSITION_SL))
{
sl=PositionGetDouble(POSITION_PRICE_OPEN)+BUPoint*_Point;
tp=PositionGetDouble(POSITION_TP);
trade.PositionModify(_Symbol,sl,tp);
}
}
}
if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
{
if(PositionGetDouble(POSITION_PRICE_OPEN)>=Ask+(BULevel+BUPoint)*_Point)
{
if(PositionGetDouble(POSITION_PRICE_OPEN)<PositionGetDouble(POSITION_SL) || PositionGetDouble(POSITION_SL)==0)
{
sl=PositionGetDouble(POSITION_PRICE_OPEN)-BUPoint*_Point;
tp=PositionGetDouble(POSITION_TP);
trade.PositionModify(_Symbol,sl,tp);
}
}
}
}
}
}
//+------------------------------------------------------------------+
//| Expert tick function |
//+------------------------------------------------------------------+
void OnTick()
{
//--- Копируем значения индикаторов
CopyBuffer(WOHandle,0,0,3,WO);
CopyBuffer(MAHandle,0,0,1,MA);
// Лучшее предложение на покупку
double Ask=SymbolInfoDouble(_Symbol,SYMBOL_ASK);
// Лучшее предложение на продажу
double Bid=SymbolInfoDouble(_Symbol,SYMBOL_BID);
//--- Стопы
double stop=0,take=0;
//--- объявляем переменные типа boolean, они будут использоваться при проверке условий для покупки и продажи
bool Buy=WO[2]>50 && WO[1]<50 && Ask>MA[0];
bool Sell=WO[2]<50 && WO[1]>50 && Ask<MA[0];
if(BULevel>0) BU();
//Нет позиции и сигнал на покупку
if(PositionsTotal()<1 && Buy)
{
//--- Вычисляем стопы
if(SL==0)stop=0; else stop=NormalizeDouble(Ask-SL*_Point,_Digits);
if(TP==0)take=0; else take=NormalizeDouble(Ask+TP*_Point,_Digits);
//--- Открываем ордер на покупку
trade.PositionOpen(_Symbol,ORDER_TYPE_BUY,Lot,Ask,stop,take);
//--- Ставим виртуальные стопы
}
//Нет позиции и сигнал на продажу
if(PositionsTotal()<1 && Sell)
{
//--- Вычисляем стопы
if(SL==0)stop=0; else stop=NormalizeDouble(Bid+SL*_Point,_Digits);
if(TP==0)take=0; else take=NormalizeDouble(Bid-TP*_Point,_Digits);
//--- Открываем ордер на продажу
trade.PositionOpen(_Symbol,ORDER_TYPE_SELL,Lot,Bid,stop,take);
}
// Закрытие по сигналу
if(PositionSelect(_Symbol))
{
// Открыта покупка
if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_BUY)
{
// Закрываем позицию бай
if(Sell)trade.PositionClose(_Symbol);
}
// Открыта продажа
if(PositionGetInteger(POSITION_TYPE)==POSITION_TYPE_SELL)
{
// Закрываем позицию селл
if(Buy)trade.PositionClose(_Symbol);
}
}
Comment("\n WO1: ",WO[1],"\n WO2: ",WO[2]);
}
//+------------------------------------------------------------------+
#include <SmoothAlgorithms.mqh>
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void ClosePos()
{
double lime= iCustom(NULL,0,IndName,2,Shift);
double red = iCustom(NULL,0,IndName,3,Shift);
//---
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()==OP_BUY)
{
if(red<1000)
{
CloseAll(0);
}
}
if(OrderType()==OP_SELL)
{
if(lime<1000)
{
CloseAll(1);
}
}
}
}
}
}
if(CountTrades()>0) ClosePos();
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
void CloseAll(int ot=-1)
{
bool cl;
for(int i=OrdersTotal()-1;i>=0;i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if(OrderType()==0 && (ot==0 || ot==-1))
{
RefreshRates();
cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),Slip,White);
}
if(OrderType()==1 && (ot==1 || ot==-1))
{
RefreshRates();
cl=OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),Slip,White);
}
}
}
}
}
Особенности ТЗ:
AM2