[AVISO FECHADO!] Qualquer pergunta de novato, para não desorganizar o fórum. Profissionais, não passem por aqui. Não posso ir a lugar algum sem você. - página 174

 
Por favor, informe. Tenho um consultor especializado em uma janela (por exemplo, USDJPY), mas preciso dele para colocar setas(ObjectCreate) em outras janelas abertas, por exemplo, AUDUSD, EURUSD, etc.
 
nicdevis >> :
>> Por favor, informe. Tenho um consultor especializado em uma janela (por exemplo, USDJPY) e preciso dele para definir setas(ObjectCreate) em um determinado momento em outras janelas abertas, por exemplo, AUDUSD, EURUSD e.t.c.

Se você olhar no ajudante ObjectCreate, você pode ver claramente que ele só funciona dentro de um único gráfico aberto, no qual o indicador ou o Expert Advisor está localizado. A saída pode ser a transferência de dados para o Expert Advisor na janela desejada através das variáveis ou arquivo global.

 
granit77 >> :

Se você olhar no ajudante ObjectCreate, você pode ver claramente que ele só funciona dentro de um único gráfico aberto, no qual o indicador ou o Expert Advisor está localizado. A saída pode ser a transferência de dados para o Expert Advisor na janela necessária através de variáveis globais ou de um arquivo.

Ou seja, não há como fazer isso de outra janela? >> Obrigado.

 

Como esta função de modificação de ordem pendente pode ser desativada através de variáveis externas?


//+------------------------------------------------------------------+
//| Модификация ордеров                                              |
//+------------------------------------------------------------------+
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 писал(а) >>

Como esta função de modificação de ordem pendente pode ser desativada através de variáveis externas?

extern bool bModify=false;
int start()
  if ( bModify) ModifyOrders();
  return(0);
}
Algo como isto
 
Vinin >> :
>> algo parecido com isto.

Obrigado! Vinin!

>> Vou tentar).

 
Canal EA

Programadores, por favor, ajudem-me, preciso de um EA para abrir pedidos, mesmo que já estejam abertos. Este é um canal EA. Toda vez que uma linha toca uma das linhas, a ordem correspondente deve ser aberta. Gostaria de agradecer antecipadamente a vocês.



//+------------------------------------------------------------------+
//| 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);
}

 

O mais provável é que você seja prejudicado por esta linha:

if (NumPos > 0) return(0);

Podemos começar com isto. Isto deve ser removido.

E separar o mecanismo de entrada de compra e venda. Pegue a função de I.Kim (insira-a no final do código)





//+----------------------------------------------------------------------------+
//|  Версия   : 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);}

Então, a condição de abertura da transação será a compra:



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



E a condição para a abertura de um comércio de venda :



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


 
RomanS писал(а) >>

Este problema provavelmente já foi resolvido antes de 2003. Mas como alguém não sabe, eu vou compartilhar))))

Clique com o botão direito no gráfico - selecionar propriedades - guia geral - verificar escala fixa - OK

Depois passe o mouse sobre a escala de preços, clique com o botão esquerdo e mantenha-o pressionado, mova o mouse para cima/para baixo para ajustar a escala.

Você pode tê-lo na janela principal, para não ter que olhar para longe.

 
Synax >> :
Canal EA

Quero pedir à EA que abra pedidos, mesmo que já estejam abertos. Este é um canal EA, sempre que uma linha ou outra for tocada, a ordem correspondente deve ser aberta. Creio que esta EA abrirá uma ordem e não abrirá outra até que ela feche.



Eu fiz o que descrevi no post acima. Eu inseri a função número de posições e substituí o bloco de abertura de posição no final por este:

//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);
}}

Agora a EA pode ocupar pelo menos 2 posições ao mesmo tempo.

Desculpe, não posso testá-lo pois você esqueceu de anexar o indicador que desenha os canais.

Arquivos anexados: