[Qualsiasi domanda da principiante, per non ingombrare il forum. Professionisti, non passate. Non posso andare da nessuna parte senza di te. - pagina 174

 
Si prega di avvisare. Ho un Expert Advisor in una finestra (per esempio USDJPY), ma ho bisogno che metta delle frecce(ObjectCreate) in altre finestre aperte, per esempio AUDUSD, EURUSD ecc.
 
nicdevis >> :
>> Si prega di consigliare. Ho un Expert Advisor in una finestra (per esempio, USDJPY) e ho bisogno di impostare delle frecce(ObjectCreate) in un certo momento in altre finestre aperte, per esempio, AUDUSD, EURUSD ecc.

Se guardate nell'helper ObjectCreate, potete vedere chiaramente che funziona solo all'interno di un singolo grafico aperto, sul quale si trova l'indicatore o Expert Advisor. L'output può essere il trasferimento di dati all'Expert Advisor nella finestra desiderata attraverso le variabili globali o il file.

 
granit77 >> :

Se guardate nell'helper ObjectCreate, potete vedere chiaramente che funziona solo all'interno di un singolo grafico aperto, sul quale si trova l'indicatore o Expert Advisor. L'output può essere il trasferimento di dati all'Expert Advisor nella finestra richiesta attraverso variabili globali o un file.

Cioè, non c'è modo di farlo da un'altra finestra? >> Grazie.

 

Come si può disattivare questa funzione di modifica degli ordini in sospeso tramite variabili esterne?


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

Come si può disattivare questa funzione di modifica degli ordini in sospeso tramite variabili esterne?

extern bool bModify=false;
int start()
  if ( bModify) ModifyOrders();
  return(0);
}
Qualcosa del genere
 
Vinin >> :
>> qualcosa del genere.

Grazie! Vinin!

>> Lo proverò).

 
Canale EA

Programmatori, per favore aiutatemi, ho bisogno di un EA per aprire gli ordini, anche se sono già aperti. Questo è un EA a canali. Ogni volta che una linea tocca una delle linee, l'ordine corrispondente deve essere aperto. Vorrei ringraziarvi in anticipo.



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

 

È molto probabile che siate ostacolati da questa linea:

if (NumPos > 0) return(0);

Possiamo iniziare con questo. Questo dovrebbe essere rimosso.

E separare il meccanismo di entrata di acquisto e di vendita. Prendete la funzione di I.Kim (inseritela alla fine del codice)





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

Poi la condizione di apertura della transazione sarà comprare:



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



E la condizione per aprire un trade di vendita:



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


 
RomanS писал(а) >>

Questo problema è stato probabilmente risolto prima del 2003, ma visto che qualcun altro non lo sa, lo condivido)))

Cliccate con il tasto destro del mouse sul grafico - selezionate proprietà - scheda generale - spuntate scala fissa - OK

Poi passa il mouse sulla scala dei prezzi, clicca con il tasto sinistro e tienilo premuto, muovi il mouse su/giù per regolare la scala.

Potreste averla nella finestra principale, quindi non dovete cercare lontano.

 
Synax >> :
Canale EA

Voglio chiedere all'EA di aprire gli ordini anche se sono già aperti. Questo è un canale EA, ogni volta che una linea o un'altra viene toccata, l'ordine corrispondente dovrebbe essere aperto. Penso che questo EA aprirà un ordine e non ne aprirà un altro fino alla sua chiusura.



Ho fatto quello che ho descritto nel post sopra. Ho inserito la funzione numero di posizioni e ho sostituito il blocco di apertura delle posizioni alla fine con questo:

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

Ora EA può tenere almeno 2 posizioni allo stesso tempo.

Mi dispiace, non posso testarlo, perché hai dimenticato di allegare l'indicatore che disegna i canali.

File:
Motivazione: