[ВНИМАНИЕ, ТЕМА ЗАКРЫТА!] Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда. - страница 174

 
Подскажите, пожалуйста. У меня эксперт сидит в одном окне (например, USDJPY), а мне нужно, что бы он в определёный момент ставил стрелочки (ObjectCreate)  в других открытых окнах- например, AUDUSD, EURUSD e.t.c.
 
nicdevis >>:
Подскажите, пожалуйста. У меня эксперт сидит в одном окне (например, USDJPY), а мне нужно, что бы он в определёный момент ставил стрелочки (ObjectCreate) в других открытых окнах- например, AUDUSD, EURUSD e.t.c.

Если заглянуть в хелп по ObjectCreate, то ясно видно, что он работает только внутри одного открытого графика, на котором стоит индикатор или советник. Выходом может быть передача данных советнику в нужном окне через глобальные переменные или файл.

 
granit77 >>:

Если заглянуть в хелп по ObjectCreate, то ясно видно, что он работает только внутри одного открытого графика, на котором стоит индикатор или советник. Выходом может быть передача данных советнику в нужном окне через глобальные переменные или файл.

Т.е., из другого окна никак? Спасибо.

 

Как сделать так, что бы эта функция модификации отложенных ордеров была отключаемой через внешние переменные?


//+------------------------------------------------------------------+
//| Модификация ордеров                                              |
//+------------------------------------------------------------------+
void ModifyOrders() {
  bool   fm;
  double ldStop=0, ldTake=0;
  int    spr=MarketInfo(Symbol(), MODE_SPREAD);
  double pAsk=Ask+(DistanceSet+spr)*Point;
  double pBid=Bid-DistanceSet*Point;

  for (int i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC+1) {
        if (StopLoss!=0) ldStop=pAsk-StopLoss*Point;
        if (TakeProfit!=0) ldTake=pAsk+TakeProfit*Point;
        OrderModify(OrderTicket(), pAsk, ldStop, ldTake, 0, clModifyBuy);
      }
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC+2) {
        if (StopLoss!=0) ldStop=pBid+StopLoss*Point;
        if (TakeProfit!=0) ldTake=pBid-TakeProfit*Point;
        OrderModify(OrderTicket(), pBid, ldStop, ldTake, 0, clModifySell);
      }
    }
  }
}

//+------------------------------------------------------------------+
//| Возвращает флаг существования ордера или позиции по номеру       |
//+------------------------------------------------------------------+
bool ExistOrder(int mn) {
  bool Exist=False;
  for (int i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC+mn) {
        Exist=True; break;
      }
    }
  }
  return(Exist);
}

//+------------------------------------------------------------------+
//| Возвращает флаг существования позиции по номеру                  |
//+------------------------------------------------------------------+
bool ExistPosition(int mn) {
  bool Exist=False;
  for (int i=0; i<OrdersTotal(); i++) {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES)) {
      if (OrderSymbol()==Symbol() && OrderMagicNumber()==MAGIC+mn) {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          Exist=True; break;
        }
      }
    }
  }
  return(Exist);
}
 
1Rakso писал(а) >>

Как сделать так, что бы эта функция модификации отложенных ордеров была отключаемой через внешние переменные?

extern bool bModify=false;
int start()
  if (bModify) ModifyOrders();
  return(0);
}
Что то так
 
Vinin >>:
Что то так

Спасибо! Vinin!

попробую)

 
Канальный советник

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



//+------------------------------------------------------------------+
//| TradeChannel.mq4 |
//| Copyright © 2005, Yuri Makarov |
//| http://mak.tradersmind.com |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2005, Yuri Makarov"
#property link "http://mak.tradersmind.com"

extern double Lots = 1.0;
extern int Slippage = 5;
extern int TimeOut = 10000;

double SetLevel(double Level, double NewLevel, string ObjName, int Style)
{
switch (Style)
{
case 1: // Buy Order line
ObjectSet(ObjName,OBJPROP_COLOR,Blue);
ObjectSet(ObjName,OBJPROP_STYLE,STYLE_SOLID);
ObjectSet(ObjName,OBJPROP_WIDTH,2);
break;
case 2: // Sell Order line
ObjectSet(ObjName,OBJPROP_COLOR,Red);
ObjectSet(ObjName,OBJPROP_STYLE,STYLE_SOLID);
ObjectSet(ObjName,OBJPROP_WIDTH,2);
break;
case 3: // Buy Stop line
ObjectSet(ObjName,OBJPROP_COLOR,Blue);
ObjectSet(ObjName,OBJPROP_STYLE,STYLE_DASH);
ObjectSet(ObjName,OBJPROP_WIDTH,1);
break;
case 4: // Sell Stop line
ObjectSet(ObjName,OBJPROP_COLOR,Red);
ObjectSet(ObjName,OBJPROP_STYLE,STYLE_DASH);
ObjectSet(ObjName,OBJPROP_WIDTH,1);
break;
case 5: // Buy Take line
ObjectSet(ObjName,OBJPROP_COLOR,Blue);
ObjectSet(ObjName,OBJPROP_STYLE,STYLE_DOT);
ObjectSet(ObjName,OBJPROP_WIDTH,1);
break;
case 6: // Sell Take line
ObjectSet(ObjName,OBJPROP_COLOR,Red);
ObjectSet(ObjName,OBJPROP_STYLE,STYLE_DOT);
ObjectSet(ObjName,OBJPROP_WIDTH,1);
break;
}

if (MathAbs(NewLevel - Close[0]) < MathAbs(Level - Close[0])) return (NewLevel);
else return (Level);
}

int start()
{
int NumObj = ObjectsTotal();
double Spread = Ask - Bid;

double pBuy = 0;
double pSell = 0;
double pBuyStop = 0;
double pBuyTake = 0;
double pSellStop = 0;
double pSellTake = 0;

for (int i = 0; i < NumObj; i++)
{
string ObjName = ObjectName(i);
string ObjDesc = ObjectDescription(ObjName);
double Price = 0;

switch (ObjectType(ObjName))
{
case OBJ_HLINE:
Price = ObjectGet(ObjName,OBJPROP_PRICE1);
break;
case OBJ_TREND:
Price = ObjectGetValueByShift(ObjName,0);
break;
}

if (Price > 0)
{
if (ObjDesc == "Buy") pBuy = SetLevel(pBuy, Price, ObjName, 1); else
if (ObjDesc == "Sell") pSell = SetLevel(pSell, Price, ObjName, 2); else
if (ObjDesc == "Stop")
{
if (Price < Close[0]) pBuyStop = SetLevel(pBuyStop, Price, ObjName, 3);
else pSellStop = SetLevel(pSellStop, Price, ObjName, 4);
} else
if (ObjDesc == "Take")
{
if (Price > Close[0]) pBuyTake = SetLevel(pBuyTake, Price, ObjName, 5);
else pSellTake = SetLevel(pSellTake, Price, ObjName, 6);
}
}
}

int NumOrders = OrdersTotal();
int NumPos = 0;

for (i = 0; i < NumOrders; i++)
{
OrderSelect(i, SELECT_BY_POS);
if (OrderSymbol() != Symbol()) continue;

NumPos++;

double tp = OrderTakeProfit();
double sl = OrderStopLoss();

if (OrderType() == OP_BUY)
{
if (Bid > pSell && pSell > 0)
{
OrderClose(OrderTicket(), OrderLots(), Bid, Slippage, Red);
Sleep(TimeOut);
return(0);
}
if (MathAbs(tp - pBuyTake) > Spread || MathAbs(sl - pBuyStop) > Spread)
{
OrderModify(OrderTicket(), Ask, pBuyStop, pBuyTake, 0);
Sleep(TimeOut);
return(0);
}
}

if (OrderType() == OP_SELL)
{
if (Ask < pBuy)
{
OrderClose(OrderTicket(), OrderLots(), Ask, Slippage, Red);
Sleep(TimeOut);
return(0);
}
if (MathAbs(tp - pSellTake) > Spread || MathAbs(sl - pSellStop) > Spread)
{
OrderModify(OrderTicket(), Bid, pSellStop, pSellTake, 0);
Sleep(TimeOut);
return(0);
}
}
}

if (NumPos > 0) return(0);
if ((pSell - pBuy) < Spread*2) return(0);

if (Bid > pSell && pSell > pBuyStop)
{
OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, pSellStop, pSellTake);
Sleep(TimeOut);
return(0);
}

if (Ask < pBuy && (pBuy < pSellStop || pSellStop == 0))
{
OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, pBuyStop, pBuyTake);
Sleep(TimeOut);
return(0);
}
}

int init()
{
return(0);
}

int deinit()
{
return(0);
}

 

Скорее всего вам мешает вот эта строка:

if (NumPos > 0) return(0);

Тут можно для начала сделать так. Это убрать.

И Разделить механизм входа бай и селл. Взять функцию И.Кима (вставить её в самЫй-самый конец кода)





//+----------------------------------------------------------------------------+
//|  Версия   : 19.02.2008                                                     |
//|  Описание : Возвращает количество позиций.                                 |
//+----------------------------------------------------------------------------+
//|  Параметры:                                                                |
//|    sy - наименование инструмента   (""   - любой символ,                   |
//|                                     NULL - текущий символ)                 |
//|    op - операция                   (-1   - любая позиция)                  |
//|    mn - MagicNumber                (-1   - любой магик)                    |
//+----------------------------------------------------------------------------+
int NumberOfPositions(string sy="", int op=-1, int mn=-1) {
  int i, k=OrdersTotal(), kp=0;

  if (sy=="0") sy=Symbol();
  for (i=0; i<k; i++)                                    {
    if (OrderSelect(i, SELECT_BY_POS, MODE_TRADES))      {
      if (OrderSymbol()==sy || sy=="")                   {
        if (OrderType()==OP_BUY || OrderType()==OP_SELL) {
          if (op<0 || OrderType()==op)                   {
            if (mn<0 || OrderMagicNumber()==mn) kp++;
          }}}}}  return(kp);}

Тогда условием открытия сделки бай будет:



if (NumberOfPositions(NULL,OP_BUY, -1)<1 ) {
//если нет бай-позиций 



А условием открытия сделки селл :



if (NumberOfPositions(NULL,OP_SELL, -1)<1) {


 
RomanS писал(а) >>

Эта проблема решена наверное еще раньше 2003 г. Но раз кто-то еще не знает, поделюсь)))

Правой кнопкой мыши щелкаешь на графике - выбираем свойства - вкладка общие - ставишь галку фиксированный масштаб - ОК

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

а нельзя ли это вывести на главное окно,чтоб не лазить далеко? а то пока залезешь время теряеться и из за этого возникают неудобства пользования МТ

 
Synax >>:
Канальный советник

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



Сделал я вам то, что описал постом выше. Вставил ф-ю числа позиций и заменил в конце блок открытия позиций на такой:

//if (NumPos > 0) return(0);
if ((pSell - pBuy) < Spread*2) return(0);
//-------------------------------------------------
if (NumberOfPositions(NULL,OP_SELL, -1)<1) {//если нет открытых селл-позиций
if (Bid > pSell && pSell > pBuyStop)//если условия соответствуют заданным
{//продаем
OrderSend(Symbol(), OP_SELL, Lots, Bid, Slippage, pSellStop, pSellTake);
Sleep(TimeOut);
return(0);
}}
//-----------------------------------------------------
if (NumberOfPositions(NULL,OP_BUY, -1)<1 ) {//если нет открытых бай-позиций
if (Ask < pBuy && (pBuy < pSellStop || pSellStop == 0))
{// покупаем
OrderSend(Symbol(), OP_BUY, Lots, Ask, Slippage, pBuyStop, pBuyTake);
Sleep(TimeOut);
return(0);
}}

Теперь советник может держать одновременно не менее 2-х позиций.

К сож. проверить работу не могу, т.к. вы забыли приложить индикатор, рисующий каналы .

Файлы:
Причина обращения: