Доработка ботов (советников, индикаторов) vol. 2

Yura Vakulenko

Активный участник
Нужна помощь!

:D:facepalm:
Вот индикатор. по нему не выходит у меня написать советник.. Работать должен только ПО ОТКРЫТИЮ БАРА! и заключать покупки (закрывать продажи если такие есть) при стрелке вверх. И заключать продажи (закрывать покупки если такие есть) при стрелке вниз. Фиксир. лотом без ТП И СЛ.

Код:
#property copyright "l"
#property strict

input double lot = 0.1;
input int Period = 5;
input int TP = 0;
input int SL = 0;

input int Magic = 24011;

int OnInit()
  {
   
   return(INIT_SUCCEEDED);
  }
void OnDeinit(const int reason)  {  }

int idir = -1, odir = -1, ocnt = 0;
double opl = 0, bufBuy, bufSell, bufBuy2, bufSell2;

void OnTick()
  {
   if (!NewBar()) return;
   ordCount();
   bufBuy   = iCustom(NULL,0,"Arrows",Period,0,1);
   bufBuy2   = iCustom(NULL,0,"Arrows",Period,0,2);
   bufSell  = iCustom(NULL,0,"Arrows",Period,1,1);
   bufSell2  = iCustom(NULL,0,"Arrows",Period,1,2);
   idir = -1;
   if (bufBuy == bufSell && bufBuy2 == EMPTY_VALUE && bufSell2 != EMPTY_VALUE) idir = OP_BUY;
   if (bufBuy == bufSell && bufBuy2 != EMPTY_VALUE && bufSell2 == EMPTY_VALUE) idir = OP_SELL;
 //  if (odir >= 0 && opl > 2)ordClose(odir);
   if (idir == 1 - odir)
   {
      ordClose(odir);
   }
   if (idir >= 0 && odir < 0) ordOpen(idir);
  }
//+------------------------------------------------------------------+

void ordOpen(int dir)
{
   int tik=-1;
   tik = OrderSend(_Symbol,dir,lot,(dir==OP_BUY?Ask:Bid),10,0,0,"Check_Indi",Magic,0,(dir==OP_BUY?Blue:Red));
   if (tik > 0)
   {
      odir = dir; ocnt = 1;
      OrderSelect(tik, SELECT_BY_TICKET);
      OrderModify(OrderTicket(),OrderOpenPrice(),(dir==OP_BUY?Bid-SL*_Point:Ask+SL*_Point),(dir==OP_BUY?Bid+TP*_Point:Ask-TP*_Point),0);
   }
}

void ordClose(int dir)
{
   if (OrderClose(OrderTicket(),OrderLots(), (dir==OP_BUY?Bid:Ask),10, Gray)) { odir = -1; ocnt = 0; opl = 0; }
}

void ordCount()
{
   int  no;
   odir = -1; ocnt = 0;  opl = 0;
   
   for (no=0; no < OrdersTotal(); no++)                     //Сбор инфы об открытых ордерах
   {
      if (!OrderSelect(no, SELECT_BY_POS, MODE_TRADES))                continue;
      if (!(OrderSymbol()== _Symbol && OrderMagicNumber() == Magic))   continue;
      
      odir = OrderType();
      ocnt++;
      opl += OrderProfit()+OrderCommission()+OrderSwap();
   }
}



bool     NewBar()
{
   static datetime new_Bar;                       
   if (new_Bar == Time[1]) return(false);        //Если бар не закрыт - выход
       new_Bar  = Time[1];
return(true);
}

Спасибо!:)
 

Вложения

  • Arrows.ex4
    7,7 КБ · Просмотры: 124

Vyacheslav88

Элитный участник
Здравствуйте Yura Vakulenko. Нашёл на просторах интернета.
 

Вложения

  • советник от стрелки к стрелки CCI.rar
    23,2 КБ · Просмотры: 178

sordex2

Интересующийся
Делаю репост поста. Всех участников форума, поздравляю с наступающими праздниками!
Уважаемые програмисты прошу доработать советник Посмотреть вложение Forex Transporter.mq4, чтобы он открывал ордера по показаниям этого индикатора Посмотреть вложение THV3 Trix v4.01 Div.mq4 . Заранее большое спасибо.
 

jenzo

Местный знаток
Ребята, если есть выведите настройки пожалуйста :)
 

Вложения

  • 5 bar reversal.mq4
    2,9 КБ · Просмотры: 74

oliva1

Элитный участник
Уважаемые!
Просьба поправить инкикатор.
Показывает ТП и СЛ, но не показывает от какого уровня и в какую сторону.
Пожалуйста!:please:
 

Вложения

  • Info.rar
    4,5 КБ · Просмотры: 44

Dominowka

Активный участник
Всех с наступающим*hi* помогите не видит терминал.:please:
 

Вложения

  • VHT.ex4
    22,1 КБ · Просмотры: 67

kipjatok001

Почетный гражданин
Ребята, всем Привет. Доработайте пожалуйста прибыльный советник.
Нужно сделать:
1. ТП Каждого ордера
2. Мартингейл выставления ордеров (каждый следующий ордер в х раз больше следующего)
3.Хорошой полноценный тралл
Заранее спасибо всем откликнувшимся.
С Наступающим
Посмотреть вложение RS 7v_cool.mq4
 

Yura Vakulenko

Активный участник
подскажите, как мне изменить код советника, чтобы была соблюдена следующая логика закрытия позиций. Для большей наглядности - я все изобразил на картинках.

Позиция закрывается полностью (100% объема) по противоположному сигналу (Большая КРАСНАЯ \ СИНЯЯ стрелки) и позиция закрывается частично по дополнительным сигналам (Маленькие желтые\синие стрелки). Все стрелки формируются на 1-м баре. И советник работает только по открытию бара.

т.е. Основной сигнал на закрытие позиции (и открытие противоположной) - это БОЛЬШИЕ СТРЕЛКИ

Дополнительный сигнал на закрытие Основной позиции - это маленькие стрелки. (Желтая малая стрелка - закрытие продаж. Синяя малая стрелка - закрытие покупок.)

Логика закрытия:

за начальную точку отсчета берется время открытия основной позиции. Одновременно в рынке может быть открыта 1 основная позиция ( по ОСНОВНОМУ СИГНАЛУ - БОЛЬШИЕ СТРЕЛКИ)

Малые стрелки, чтобы использовать их в роли доп. сигнала на закрытие - должны появится только после открытия основной позиции.

появилась 1-я малая стрелка - закрываем 25 % основной позиции. (при условии, что цена открытия нового бара, после появления малой стрелки больше\меньше внешней переменной N ). Если условие верно, тогда закрываем 25% основной позиции. Если не верно - тогда закрываем 0% основной позиции. На данном этапе закрыто или 0% или 25% основной позиции.

появилась 2-я малая стрелка - закрываем еще 25% основной позиции. (при условии, что на первой стрелке уже было закрытие 25 % основной позиции. если же такого закрытия не было, тогда закрываем 50% основной позиции.) На данном этапе закрыто или 50% основной позиции.

появилась 3-я малая стрелка - закрываем еще 25% основной позиции.
На данном этапе закрыто или 75% основной позиции.

появилась 4-я малая стрелка - закрываем еще 25% основной позиции. На данном этапе закрыто 100% основной позиции. Т.е. ордер закрыт. 4-я стрелка появляется крайне редко! в основном их только 3. и оставшиеся 25% позиции, после первых 3-х стрелок закрываются по основному противоположному сигналу.

если же не появилось ни одной из малых стрелок, тогда позиция закрывается на 100% по против. основному сигналу.

Для того, чтобы логика закрытия была более понятной - я сделал рисунки с детальными подписями.. и там в местах закрытия подписал, какая часть позиции должна быть закрыта. Все соответсвует текущему словесному описанию алгоритма.

Условие появления доп. стрелок - я смогу составить и сам.. но, я, к сожалению, не смогу вам скинуть индикатор, который их рисует, все по той же причине - он привязан к моему ПК и счету и на другом ПК и счете работать не будет..

Помогите встроить такую функцию в код советника.

а вот текущий код советника..

//+------------------------------------------------------------------+
//| indicator_test.mq4 |
//| |
//| |
//+------------------------------------------------------------------+
#property copyright ""
#property link ""
//--------------------------------------------------------------------
extern int SmoothPeriod = 5,
SmoothMethod = 1,
Notify = 0;
extern double stoploss = 0,
takeprofit = 0,
TrailingStop = 0;
extern double LOT = 0.1;
extern bool Close_on_Oposite = true;
extern bool Buy_allow = true;
extern bool Sell_allow = true;
extern bool mode_reverse = false;
//--------------------------------------------------------------------
int STOPLEVEL,Magic=1234567890;


//--------------------------------------------------------------------

int OnInit()
{

return(INIT_SUCCEEDED);
}
void OnDeinit(const int reason) { }


void OnTick()
{
if (!NewBar()) return;
STOPLEVEL=MarketInfo(Symbol(),MODE_STOPLEVEL);
if (TrailingStop>=STOPLEVEL) TrailingStop();

double bufBuy, bufBuy2,bufSell,bufSell2;

//bufBuy = iCustom(NULL,0,"Arrows",SmoothPeriod,0,1);
//bufSell = iCustom(NULL,0,"Arrows",SmoothPeriod,1,1);

bufBuy = iCustom(NULL,0,"Market\\evolution",SmoothPeriod,SmoothMethod,Notify,0,1);
bufBuy2 = iCustom(NULL,0,"Market\\evolution",SmoothPeriod,SmoothMethod,Notify,0,2);
bufSell = iCustom(NULL,0,"Market\\evolution",SmoothPeriod,SmoothMethod,Notify,1,1);
bufSell2 = iCustom(NULL,0,"Market\\evolution",SmoothPeriod,SmoothMethod,Notify,1,2);

double SL,TP;
if (Buy_allow)
{
if (bufBuy==bufSell && bufSell2 !=0 && bufBuy2 == 0)//if (bufBuy != 0 && bufSell == 0 )//
{
if (!mode_reverse)
{
if (takeprofit!=0) TP = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP = 0;
if (stoploss!=0) SL = NormalizeDouble(Bid - stoploss*Point,Digits); else SL = 0;
if (Close_on_Oposite) CLOSEORDER(OP_SELL);
int tik_buy = OrderSend(Symbol(),OP_BUY,LOT,NormalizeDouble(Ask,Digits),2,SL,TP,"Ind check buy",Magic,0,clrBlue);
if(tik_buy>0)
{
if(OrderSelect(tik_buy,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order #",tik_buy," opened : ",NormalizeDouble(OrderOpenPrice(),Digits));
}
else
Print("Error opening BUY order #",tik_buy," : ",GetLastError());
}

else

{
if (takeprofit!=0) TP = NormalizeDouble(Bid - takeprofit*Point,Digits); else TP = 0;
if (stoploss!=0) SL = NormalizeDouble(Ask + stoploss*Point,Digits); else SL = 0;
if (Close_on_Oposite) CLOSEORDER(OP_BUY);
int tik_sell_on_reverse_buy = OrderSend(Symbol(),OP_SELL,LOT,NormalizeDouble(Bid,Digits),2,SL,TP,"Ind check sell",Magic,0,clrRed);
if(tik_sell_on_reverse_buy>0)
{
if(OrderSelect(tik_sell_on_reverse_buy,SELECT_BY_TICKET,MODE_TRADES))
Print("SELL order #",tik_sell_on_reverse_buy," opened : ",NormalizeDouble(OrderOpenPrice(),Digits));
}
else
Print("Error opening SELL order #",tik_sell_on_reverse_buy," : ",GetLastError());

}

}
}

if (Sell_allow)
{
if (bufBuy==bufSell && bufSell2 ==0 && bufBuy2 != 0)//if (bufSell != 0 && bufBuy == 0)//
{
if (!mode_reverse)
{

if (takeprofit!=0) TP = NormalizeDouble(Bid - takeprofit*Point,Digits); else TP = 0;
if (stoploss!=0) SL = NormalizeDouble(Ask + stoploss*Point,Digits); else SL = 0;
if (Close_on_Oposite) CLOSEORDER(OP_BUY);
int tik_sell = OrderSend(Symbol(),OP_SELL,LOT,NormalizeDouble(Bid,Digits),2,SL,TP,"Ind check sell",Magic,0,clrRed);
if(tik_sell>0)
{
if(OrderSelect(tik_sell,SELECT_BY_TICKET,MODE_TRADES))
Print("SELL order #",tik_sell," opened : ",NormalizeDouble(OrderOpenPrice(),Digits));
}
else
Print("Error opening SELL order #",tik_sell," : ",GetLastError());

}

else

{
if (takeprofit!=0) TP = NormalizeDouble(Ask + takeprofit*Point,Digits); else TP = 0;
if (stoploss!=0) SL = NormalizeDouble(Bid - stoploss*Point,Digits); else SL = 0;
if (Close_on_Oposite) CLOSEORDER(OP_SELL);
int tik_buy_on_reverse_sell = OrderSend(Symbol(),OP_BUY,LOT,NormalizeDouble(Ask,Digits),2,SL,TP,"Ind check buy",Magic,0,clrBlue);
if(tik_buy_on_reverse_sell>0)
{
if(OrderSelect(tik_buy_on_reverse_sell,SELECT_BY_TICKET,MODE_TRADES))
Print("BUY order #",tik_buy_on_reverse_sell," opened : ",NormalizeDouble(OrderOpenPrice(),Digits));
}
else
Print("Error opening BUY order #",tik_buy_on_reverse_sell," : ",GetLastError());

}
}
}

//return (0);
}
//--------------------------------------------------------------------
void CLOSEORDER(int ord)
{
for (int i=0; i<OrdersTotal(); i++)
{
if (OrderSelect(i,SELECT_BY_POS,MODE_TRADES))
{
if (OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
if (OrderType()==OP_BUY && ord==OP_BUY)
OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Bid,Digits),3,CLR_NONE);
if (OrderType()==OP_SELL && ord==OP_SELL)
OrderClose(OrderTicket(),OrderLots(),NormalizeDouble(Ask,Digits),3,CLR_NONE);
}
}
}
}
//--------------------------------------------------------------------
void TrailingStop()
{
int tip,Ticket;
double StLo,OSL,OOP;
for (int i=0; i<OrdersTotal(); i++)
{ if (OrderSelect(i, SELECT_BY_POS)==true)
{ tip = OrderType();
if (tip<2 && OrderSymbol()==Symbol() && OrderMagicNumber()==Magic)
{
OSL = NormalizeDouble(OrderStopLoss(),Digits);
OOP = NormalizeDouble(OrderOpenPrice(),Digits);
Ticket = OrderTicket();
if (tip==OP_BUY)
{
StLo = NormalizeDouble(Bid-TrailingStop*Point,Digits);
if (StLo > OSL && StLo > OOP)
{ if (!OrderModify(Ticket,OOP,StLo,OrderTakeProfit(),0,White))
Print("TrailingStop Error ",GetLastError()," buy SL ",OSL,"->",StLo);
}
}
if (tip==OP_SELL)
{
StLo = NormalizeDouble(Ask+TrailingStop*Point,Digits);
if (StLo > OOP || StLo==0) continue;
if (StLo < OSL || OSL==0 )
{ if (!OrderModify(Ticket,OOP,StLo,OrderTakeProfit(),0,White))
Print("TrailingStop Error ",GetLastError()," sell SL ",OSL,"->",StLo);
}
}
}
}
}

}

//--------------------------------------------------------------------

bool NewBar()
{
static datetime new_Bar;
if (new_Bar == Time[1]) return(false); //Если бар не закрыт - выход
new_Bar = Time[1];
return(true);
}
 

Вложения

  • close_logic_GBPUSDproM30_1.png
    close_logic_GBPUSDproM30_1.png
    52,3 КБ · Просмотры: 362
  • close_logic_GBPUSDproM30_2.png
    close_logic_GBPUSDproM30_2.png
    51,1 КБ · Просмотры: 239

olegkrg

Местный знаток
Вылечите больного....Всех с наступающим Новым годом!*hi*
 

Вложения

  • Woodie_CCI_Adv.1.0.mq4
    22,5 КБ · Просмотры: 73

John174RUS

Прохожий
Всем привет !
у меня с советником полная печалка может кто посмотрит

он открывает ордера СЕЛЛ, даже там где должен открывать БАЙ
И еще проблемка как сделать чтоб ордер СЕЛЛ с лотом 0.02 открывался на ТЕЙК ПРОФИТЕ ордераСЕЛЛ с лотом 0.04 и только один раз,а то его вышибает СТОП ЛОССОМ и он тут же повторяет сделку???
Советник писал с индикатора TMA with Distances.mq4

//+------------------------------------------------------------------+
//| Сова TMA Probnik.mq4 |
//| Copyright 2014, MetaQuotes Software Corp. |
//| _https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2014, MetaQuotes Software Corp."
#property link "_https://www.mql5.com"
#property version "1.00"
#property strict
#define MAGIC 1234
#define IDENT "mo_bidir"

extern double Lots =0.04;
extern double Lot =0.02;
extern double Lot2 =0.01;
extern int TakeProfit =15;
extern int StopLoss = 15;
extern int Slippage = 5;
extern string comment ="Tma bot";
extern int Megic =123;
extern string Indi ="Данные индикатора";
extern string TimeFrame ="current time frame";
extern int HalfLength =56;
extern int Price =PRICE_CLOSE;
extern double ATRMultiplier =2.0;
extern int ATRPeriod =100;
extern bool Interpolate =true;

double PRICE_HIGH2,PRICE_LOW2,SL,TP,SL1,TP1;

int last_bar=0;

int ticket;
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int init()
{
if(Digits==3 || Digits==5)
{
TakeProfit *=10;
StopLoss *= 10;
Slippage *= 10;
}

return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int start()
{
{
PRICE_HIGH2= iCustom(Symbol(),0,"Tma",TimeFrame,HalfLength,Price,ATRMultiplier,ATRPeriod,Interpolate,1,0);
PRICE_LOW2 = iCustom(Symbol(),0,"Tma",TimeFrame,HalfLength,Price,ATRMultiplier,ATRPeriod,Interpolate,2,0);
}

if(OrdersTotal() && CountSell()==0)

SL = NormalizeDouble(Bid+StopLoss * Point, Digits);
TP = NormalizeDouble(Ask-StopLoss * Point, Digits);

ticket=OrderSend(Symbol(),OP_SELL,Lot,Bid,Slippage,Bid+StopLoss*Point,Ask-StopLoss*Point,IDENT,MAGIC,0,Red);
if(ticket>0)

if(Bid>=PRICE_HIGH2 && CountSell()==0)
{
{
SL = NormalizeDouble(Bid + StopLoss * Point, Digits);
TP = NormalizeDouble(Bid - TakeProfit * Point, Digits);

ticket=OrderSend(Symbol(),OP_SELL,Lots,Bid,Slippage,0,0,comment,Megic,0,Magenta);
if(ticket>0)

if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)==true)
bool modify=OrderModify(ticket,OrderOpenPrice(),SL,TP,0);
}

}

if(Ask<=PRICE_LOW2 && CountBuy()==0)
{
SL = NormalizeDouble(Ask - StopLoss * Point, Digits);
TP = NormalizeDouble(Bid + StopLoss * Point, Digits);

ticket=OrderSend(Symbol(),OP_BUY,Lot2,Ask,Slippage,0,0,comment,Megic,0,Blue);
if(ticket<0)
{
if(OrderSelect(ticket,SELECT_BY_TICKET,MODE_TRADES)==true)
bool modify=OrderModify(ticket,OrderOpenPrice(),SL,TP,0);
}

}

if(Ask<=PRICE_LOW2 && CountSell()>0)
{
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
if(OrderMagicNumber()==Megic && OrderType()==OP_SELL)
bool close=OrderClose(OrderTicket(),OrderLots(),Ask,Slippage,Black);
}
}
}

if(Bid>=PRICE_HIGH2 && CountBuy()>0)
{
for(int i=OrdersTotal()-1; i>=0; i--)
{
if(OrderSelect(i,SELECT_BY_POS,MODE_TRADES)==true)
{
if(OrderMagicNumber()==Megic && OrderType()==OP_BUY)
bool close=OrderClose(OrderTicket(),OrderLots(),Bid,Slippage,Black);
}
}
}
return(0);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int CountSell()
{
int count=0;
for(int trade=OrdersTotal()-1; trade>=0; trade--)
{
bool select=OrderSelect(trade,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Megic)
{
if(OrderType()==OP_SELL)
count++;
}
}

return(count);
}
//+------------------------------------------------------------------+
//| |
//+------------------------------------------------------------------+
int CountBuy()
{
int count=0;
for(int trade=OrdersTotal()-1; trade>=0; trade--)
{
bool select=OrderSelect(trade,SELECT_BY_POS,MODE_TRADES);
if(OrderSymbol()==Symbol() && OrderMagicNumber()==Megic)
{
if(OrderType()==OP_BUY)
count++;
}
}
return(count);
}
//+------------------------------------------------------------------+
 
Последнее редактирование модератором:

oliva1

Элитный участник
Просьба

Прошу повторно, люди, кто умеет?
Поправьте индикатор.
Показывает ТП и СЛ, но не показывает от какого уровня и в какую сторону.
 

Вложения

  • Info.mq4
    3,5 КБ · Просмотры: 43
Верх