//+------------------------------------------------------------------+
extern string T = "Параметры торговли";
int ИНН=3333333;
extern double ЛотОткрытия = 0.02;
int Повтор = 1;
extern int Лось = 100;
extern int Профит = 100;
extern int Пип = 50;
bool Принт=false;
extern string ММ = "Мани менеджмент";
extern bool ИспользоватьММ = false;
extern double Риск = 10;
extern double ИспользоватьПроцентБаланса = 100;
extern double Потери= 1000;
extern double Экспонента =1.7;
double Покупка,Продажа,ПокупкаЛока,ПродажаЛока,открытие,ПрофитЗакрытия,Лосик,Проф,глав,сиг,глав1,сиг1;
string Коментарий, Команда="",тип,ком;
int билет,КоличествоОрдеров,операция,цвет,ордер;
extern string I = "Параметры Индюка";
extern int ПериодСигнала = 4;
extern int ПериодУсреднения = 2;
int Коэффициент1 = 1;
int Разрешение1 = 1;
int Разрешение2 = 1;
int СмещениеМакс = 999;
double Матрица1[];
double Матрица2[];
double Матрица3[];
double Матрица4[];
double Матрица5[];
double Матрица6[];
bool ВключитьСигнализацию = FALSE;
bool Email = FALSE;
bool ПодтверждениеПокупка = FALSE;
bool ПодтверждениеПродажа = FALSE;
datetime Время;
static int Смена=0,Сигнал;
int start() {
double ИндюкВВ1[25000];
double ИндюкВВ2[25000];
double МатрицаСигналов2[25000];
double МатрицаСигналов1[25000];
double Максималка;
double Закрывалка;
for (int Смещение = СмещениеМакс; Смещение > 0; Смещение--) {
Матрица1[Смещение] = 0;
Матрица2[Смещение] = 0;
Матрица3[Смещение] = 0;
Матрица4[Смещение] = 0;
Матрица5[Смещение] = 0;
Матрица6[Смещение] = 0;
}
for (Смещение = СмещениеМакс - ПериодСигнала - 1; Смещение > 0; Смещение--) {
ИндюкВВ1[Смещение] = iBands(NULL, 0, ПериодСигнала, ПериодУсреднения, 0, PRICE_CLOSE, MODE_UPPER, Смещение);
ИндюкВВ2[Смещение] = iBands(NULL, 0, ПериодСигнала, ПериодУсреднения, 0, PRICE_CLOSE, MODE_LOWER, Смещение);
if (Close[Смещение] > ИндюкВВ1[Смещение + 1]) Сигнал = 1;
if (Close[Смещение] < ИндюкВВ2[Смещение + 1]) Сигнал = -1;
if (Сигнал > 0 && ИндюкВВ2[Смещение] < ИндюкВВ2[Смещение + 1]) ИндюкВВ2[Смещение] = ИндюкВВ2[Смещение + 1];
if (Сигнал < 0 && ИндюкВВ1[Смещение] > ИндюкВВ1[Смещение + 1]) ИндюкВВ1[Смещение] = ИндюкВВ1[Смещение + 1];
МатрицаСигналов2[Смещение] = ИндюкВВ1[Смещение] + (Коэффициент1 - 1) / 2.0 * (ИндюкВВ1[Смещение] - ИндюкВВ2[Смещение]);
МатрицаСигналов1[Смещение] = ИндюкВВ2[Смещение] - (Коэффициент1 - 1) / 2.0 * (ИндюкВВ1[Смещение] - ИндюкВВ2[Смещение]);
if (Сигнал > 0 && МатрицаСигналов1[Смещение] < МатрицаСигналов1[Смещение + 1]) МатрицаСигналов1[Смещение] = МатрицаСигналов1[Смещение + 1];
if (Сигнал < 0 && МатрицаСигналов2[Смещение] > МатрицаСигналов2[Смещение + 1]) МатрицаСигналов2[Смещение] = МатрицаСигналов2[Смещение + 1];
if (Сигнал > 0) {
if (Разрешение1 > 0 && Матрица1[Смещение + 1] == -1.0) {
Матрица3[Смещение] = МатрицаСигналов1[Смещение];
Матрица1[Смещение] = МатрицаСигналов1[Смещение];
if (Разрешение2 > 0) Матрица5[Смещение] = МатрицаСигналов1[Смещение];
if (ВключитьСигнализацию == TRUE && Смещение == 1 && !ПодтверждениеПокупка) {
Максималка = Low[1];
if (Low[2] < Максималка) Максималка = Low[2];
if (Low[3] < Максималка) Максималка = Low[3];
if (Low[4] < Максималка) Максималка = Low[4];
Максималка -= Лось * Point;
Закрывалка = Close[1];
Сигнализация("Покупка", 0, Максималка, Закрывалка);
ПодтверждениеПокупка = TRUE;
ПодтверждениеПродажа = FALSE;
}
} else {
Матрица1[Смещение] = МатрицаСигналов1[Смещение];
if (Разрешение2 > 0) Матрица5[Смещение] = МатрицаСигналов1[Смещение];
Матрица3[Смещение] = -1;
}
if (Разрешение1 == 2) Матрица1[Смещение] = 0;
Матрица4[Смещение] = -1;
Матрица2[Смещение] = -1.0;
Матрица6[Смещение] = 0;
}
if (Сигнал < 0) {
if (Разрешение1 > 0 && Матрица2[Смещение + 1] == -1.0) {
Матрица4[Смещение] = МатрицаСигналов2[Смещение];
Матрица2[Смещение] = МатрицаСигналов2[Смещение];
if (Разрешение2 > 0) Матрица6[Смещение] = МатрицаСигналов2[Смещение];
if (ВключитьСигнализацию == TRUE && Смещение == 1 && !ПодтверждениеПродажа) {
Максималка = High[1];
if (High[2] > Максималка) Максималка = High[2];
if (High[3] > Максималка) Максималка = High[3];
if (High[4] > Максималка) Максималка = High[4];
Максималка += Лось * Point;
Закрывалка = Close[1];
Сигнализация("Продажа", 0, Максималка, Закрывалка);
ПодтверждениеПродажа = TRUE;
ПодтверждениеПокупка = FALSE;
}
} else {
Матрица2[Смещение] = МатрицаСигналов2[Смещение];
if (Разрешение2 > 0) Матрица6[Смещение] = МатрицаСигналов2[Смещение];
Матрица4[Смещение] = -1;
}
if (Разрешение1 == 2) Матрица2[Смещение] = 0;
Матрица3[Смещение] = -1;
Матрица1[Смещение] = -1.0;
Матрица5[Смещение] = 0;
}
}
if (КоличествоОткрытых("+")<1&&Сигнал==1&&Смена!=Сигнал){if (КоличествоОткрытых("-")>0)Закрытие("-");Позиция("+");}
if (КоличествоОткрытых("-")<1&&Сигнал==-1&&Смена!=Сигнал){if (КоличествоОткрытых("+")>0)Закрытие("+");Позиция("-");}
Смена=Сигнал;
return (0);
}
//+------------------------------------------------------------------+
int КоличествоОткрытых(string тип)
{ int количество=0;
int i;
for(i=OrdersTotal()-1;i>=0;i--)
{ OrderSelect(i,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=ИНН) continue;
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==ИНН)
{ if (тип == "+")
{if(OrderType()==OP_BUY) количество++;}
if (тип == "-")
{if(OrderType()==OP_SELL) количество++;}}}
return(количество);}
//+------------------------------------------------------------------+
//+ MM
//+------------------------------------------------------------------+
double ММ()
{
double лот;
double МинимальныйЛот = MarketInfo(Symbol(), MODE_MINLOT);
double МаксимальныйЛот = MarketInfo(Symbol(), MODE_MAXLOT);
double ШагЛота = MarketInfo(Symbol(), MODE_LOTSTEP);
лот = (ИспользоватьПроцентБаланса / 100) * AccountBalance() * (Риск / 100) / Потери;
лот = MathRound(лот / ШагЛота) * ШагЛота;
if(лот == 0) Print("Недостаточно ДЕПО для открытия минимального лота");
else if(NormalizeDouble(лот-МинимальныйЛот,2) < 0) {Print("Взят минимальный лот"); лот = МинимальныйЛот;}
else if(NormalizeDouble(лот-МаксимальныйЛот,2) > 0) {Print("Взят максимальный лот"); лот = МаксимальныйЛот;}
return (лот);
}
//+------------------------------------------------------------------+
//|Размер нового лота
//+------------------------------------------------------------------+
double НовыйЛот(string тип)
{ double Лот;
double МинимальныйЛот = MarketInfo(Symbol(), MODE_MINLOT);
double МаксимальныйЛот = MarketInfo(Symbol(), MODE_MAXLOT);
if(тип=="+"&&ПоследнийЗакрОрдер("-","профит")>=0&&!ИспользоватьММ)Лот = ЛотОткрытия;else
if(тип=="-"&&ПоследнийЗакрОрдер("+","профит")>=0&&!ИспользоватьММ)Лот = ЛотОткрытия;else
if(тип=="+"&&ПоследнийЗакрОрдер("-","профит")>=0&&ИспользоватьММ)Лот = ММ();else
if(тип=="-"&&ПоследнийЗакрОрдер("+","профит")>=0&&ИспользоватьММ)Лот = ММ();else
if(тип=="+"&&ПоследнийЗакрОрдер("-","профит")<0)OrderSelect(ПоследнийЗакрытый("-"),SELECT_BY_TICKET);else
if(тип=="-"&&ПоследнийЗакрОрдер("+","профит")<0)OrderSelect(ПоследнийЗакрытый("+"),SELECT_BY_TICKET);
Лот=NormalizeDouble(OrderLots()*Экспонента,2);
if(Лот < МинимальныйЛот) Лот = МинимальныйЛот;
if(Лот > МаксимальныйЛот) Лот = МаксимальныйЛот;
return(Лот);}
//+------------------------------------------------------------------+
//Возвращает цену или лот последнего ордера
//+------------------------------------------------------------------+
int ПоследнийЗакрытый(string тип)
{int t;
if (тип=="+")t=OP_BUY;
if (тип=="-")t=OP_SELL;
int i, номер=0;
for(i=OrdersHistoryTotal()-1;i>=0;i--)
{ OrderSelect(i, SELECT_BY_POS, MODE_HISTORY);
if(OrderSymbol()!=Symbol()||OrderMagicNumber()!=ИНН&&OrderType()!=t) continue;
if(OrderSymbol()==Symbol()&&OrderMagicNumber()==ИНН&&OrderType()==t&&OrderCloseTime()>0)
if(OrderTicket()>номер) номер=OrderTicket();}
return(номер);}
//+------------------------------------------------------------------+
//| открытие
//+------------------------------------------------------------------+
void Позиция(string инд)
{ double p,l;
if (инд=="+"){операция=OP_BUY; открытие=Ask;Покупка = НовыйЛот(инд);цвет=Blue;тип="Бай";}
if (инд=="-"){операция=OP_SELL; открытие=Bid;Покупка = НовыйЛот(инд);цвет=Red;тип="Селл";}
{RefreshRates();
билет=0;
while(билет<1)
{ if(Принт) Print("Покупка "+тип+". Новый. Параметры. символ="+Symbol()+", лот="+DoubleToStr(Покупка,2)+", цена="+DoubleToStr(открытие,4)+" Профит="+DoubleToStr(p,4)+" Лось="+DoubleToStr(Лосик,4)+" маджик="+ИНН);
билет = OrderSend(Symbol(),операция,Покупка,открытие,3,0,0,0,ИНН,0,цвет);
if(билет<1) {if(Принт)Print("Ошибка: ",GetLastError()," Новая попытка покупки через "+(Повтор*60)+" секунд");Sleep(Повтор*60*1000);}}}
}
//+------------------------------------------------------------------+
//| Закрытие
//+------------------------------------------------------------------+
void Закрытие(string тип)
{ int Тип;double цена;
int Проскальзывание=3;
if (тип=="-"){Тип=OP_SELL;цена=Ask;}
if (тип=="+"){Тип=OP_BUY;цена=Bid;}
for (int i=OrdersTotal()-1; i>=0; i--)
{OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (!OrderSelect(i,SELECT_BY_POS,MODE_TRADES)&&OrderType()!=Тип) break;
if (OrderSymbol()==Symbol()&&OrderMagicNumber()==ИНН&&OrderType()==Тип)OrderClose(OrderTicket(),OrderLots(),цена,Проскальзывание,CLR_NONE);
}}
//+------------------------------------------------------------------+
//Сигнализатор
//+------------------------------------------------------------------+
void Сигнализация(string ТекстДействия, double ЦенаПрофита, double ЦенаЛося, double ЦенаОткрытия) {
string НадписьЛось;
string НадписьПрофит;
string Надпись1;
string Заголовок;
string ТекстПисьма;
if (Time[0] != Время) {
Время = Time[0];
if (ЦенаОткрытия != 0.0) Надпись1 = " at price " + DoubleToStr(ЦенаОткрытия, 4);
else Надпись1 = "";
if (ЦенаПрофита != 300) НадписьПрофит = ", TakeProfit on " + DoubleToStr(ЦенаПрофита, 4);
else НадписьПрофит = "";
if (ЦенаЛося != 0.0) НадписьЛось = ", StopLoss on " + DoubleToStr(ЦенаЛося, 4);
else НадписьЛось = "";
Alert("Дятел рекомендует " + ТекстДействия + Надпись1 + НадписьПрофит + НадписьЛось + " ", Symbol(), ", ", Period(), " минутный график");
Заголовок = "Дятел рекомендует - " + ТекстДействия + Надпись1;
ТекстПисьма = "Дятел рекомендует " + ТекстДействия + Надпись1 + НадписьПрофит + НадписьЛось + " " + Symbol() + ", " + Period() + " минутный график";
if (Email) SendMail(Заголовок, ТекстПисьма);
}
}
//+------------------------------------------------------------------+
//Возвращает цену или лот последнего ордера
//+------------------------------------------------------------------+
double ПоследнийЗакрОрдер(string тип,string инф)
{ double профит;
int i, номер=0;
OrderSelect(ПоследнийЗакрытый(тип), SELECT_BY_TICKET);
профит=OrderProfit();
if(инф=="профит") return(профит);
}