//+------------------------------------------------------------------+
//| Martin TestNapisanie.mq4 |
//| Copyright 2013, MetaQuotes Software Corp. |
//| http://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright 2013, MetaQuotes Software Corp."
#property link "http://www.metaquotes.net"
extern double Lots = 0.1;
extern int TakeProfit =50;
extern int Step =30;
extern double Multiplier = 2;
extern int Magic =123;
extern int Slippage =5;
extern int ticket; // для модификации ордера
double price, TP, lastlot; // цена, тейк профит
//+------------------------------------------------------------------+
//| expert initialization function |
//+------------------------------------------------------------------+
int init()
{
if(Digits == 3 || Digits== 5) // для перевода с 4 х знаков на 5,
TakeProfit*=10; //умножаем тейк профит и степ на 10
Step*=10;
Slippage*=10;
return(0);
}
//+------------------------------------------------------------------+
//| expert deinitialization function |
//+------------------------------------------------------------------+
int deinit()
{
return(0);
}
//+------------------------------------------------------------------+
//| expert start function |
//+------------------------------------------------------------------+
int start()
{
if (CountTrades() == 0)
{
double ima = iMA(Symbol(), 0, 30, 0, MODE_SMA, PRICE_CLOSE, 1); // нажав ф1 мы уувидим какие парметры нужно указать для мовен еверидж
if (Ask> ima)
{
ticket = OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, 0, 0, "", Magic, 0, Blue); // тейк профит и стоп ставим 0 для есн счетов где допустима модификация после открытия ордера
if (ticket > 0) // если тикет больше 0 то открываем ордер ( проверка)
{
TP = NormalizeDouble(Ask + TakeProfit * Point, Digits); // определяем тейк профит
OrderModify(ticket, OrderOpenPrice(), 0, TP, 0); // модифицируем ордер,OrderOpenPrice - рыночный ордер нt тложенный
}
}
else if(Bid < ima)
{
ticket = OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, 0, 0, "", Magic, 0, Red); // тейк профит и стоп ставим 0 для есн счетов где допустима модификация после открытия ордера
if (ticket > 0)
// если тикет больше 0 то открываем ордер ( проверка)
{
TP = NormalizeDouble(Bid - TakeProfit * Point, Digits); // определяем тейк профит
OrderModify(ticket, OrderOpenPrice(), 0, TP, 0);
}
}
}
else
{
int order_type = FindLastOrderType(); // определяем какой у нас ордер бай или селл и не нужна ли ему доливка
if (order_type == OP_BUY) // нужно ли усреднение для бая
{
price = FindLastPrice(OP_BUY); // находим последнюю цену на покупку
if(Ask <= price - Step * Point)
{
lastlot = FindLastLots(OP_BUY);
lastlot = NormalizeDouble(lastlot * Multiplier, 2);
ticket = OrderSend(Symbol(), OP_BUY, lastlot, Ask, Slippage, 0, 0, "", Magic, 0, Blue); // увеличваем следующий ордер
if(ticket>0)
ModifyOrders(OP_BUY);
}
}
else if (order_type == OP_SELL)
{
price = FindLastPrice(OP_SELL); // находим последнюю цену на ппродажу
if(Bid <= price + Step * Point)
{
lastlot = FindLastLots(OP_SELL);
lastlot = NormalizeDouble(lastlot * Multiplier, 2);
ticket = OrderSend(Symbol(), OP_SELL, lastlot, Bid, Slippage, 0, 0, "", Magic, 0, Red); // увеличваем следующий ордер
if(ticket>0)
ModifyOrders(OP_SELL);
}
}
}
return(0);
}
//+------------------------------------------------------------------+
void ModifyOrders(int otype) // модифицируем тейк профит если более 1 сделки
{
double avgprice = 0,
oreder_lots = 0;
price = 0;
for(int i=OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
price += OrderOpenPrice() * OrderLots();
oreder_lots = OrderLots();
}
}
}
avgprice = NormalizeDouble(price / oreder_lots, Digits);
if (otype == OP_BUY) TP = NormalizeDouble(avgprice + TakeProfit * Point, Digits);
if (otype == OP_SELL) TP = NormalizeDouble(avgprice - TakeProfit * Point, Digits);
for(i= OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if(OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
OrderModify( OrderTicket(), OrderOpenPrice(), 0, TP, 0);
}
}
}
//+------------------------------------------------------------------+
double FindLastLots(int otype) //определяем на сколько нужно увеличить следующий лот
{
double oldlots;
int oldticket;
ticket = 0;
for( int i = OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
oldticket = OrderTicket();
if(oldticket > ticket)
{
oldlots = OrderLots();
ticket = oldticket;
}
}
}
}
return(oldlots);
}
//+------------------------------------------------------------------+
double FindLastPrice(int otype) // ищем последний ордер, чтобы от него усреднится по номеру последнего тикета
{
double oldopenprice;
int oldticket;
ticket = 0;
for (int i = OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic && OrderType() == otype)
{
oldticket = OrderTicket();
if (oldticket > ticket)
{
oldopenprice = OrderOpenPrice();
ticket = oldticket;
}
}
}
}
return(oldopenprice);
}
//+------------------------------------------------------------------+
int FindLastOrderType() // прописываем саму функцию FindLastOrderType();
{
for (int i = OrdersTotal()-1; i>=0; i--)
{
if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))
{
if (OrderSymbol() == Symbol() && OrderMagicNumber() == Magic)
return(OrderType());
}
}
return(-1);
}
//+------------------------------------------------------------------+
int CountTrades()
{
int count = 0; // пока ордеров у нас нет, значит =0
for ( int i=OrdersTotal()-1; i>=0; i--) //открывыем цикл (for)и начинаем перебирать ордера
{
if(OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) // нажав ф1 можно посмотреть что значит селект ордерс
{
if(OrderSymbol()== Symbol() && OrderMagicNumber() == Magic) // проверяем наш ли этот ордер и по нашей ли паре и магику
count++; // если ордер наш то мы его будем увеличивать на единицу
}
}
return(count); // в конце возвращаем переменную( количество ордеров)
}
//+------------------------------------------------------------------+