Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 982

 
 int x=0;
 int scale_mas[13]={0,1,2,4,8,16,32,64,128,256,512,1024,2048,4096};//объявление массива

 for(int i=0;i < ArraySize(scale_mas);i++){
    if(x == scale_mas[0])x = scale_mas[1];                       //если х=индекс0, то х=индекс1
    if(x >= ArraySize(scale_mas))x = scale_mas[11];              //если х>= размер массива, то х=индекс11
    i=x;
    if(ObjectGetInteger(0, "Button+", OBJPROP_STATE) == false){  //если кнопка "+" нажата
       i=i+1;                                                    //увеличиваем индекс на 1
       ObjectSetInteger(0, "Button+", OBJPROP_STATE,true);}
                        
    x=i;							 //присваиваем х значение последнего индекса
    if(ObjectGetInteger(0, "Button-", OBJPROP_STATE) == false){  //если кнопка "-" нажата
       i=i-1;                                                    //уменьшаем индекс на 1
    ObjectSetInteger(0, "Button-", OBJPROP_STATE,true);}
                            
    x=i;                                                         //присваиваем х значение последнего индекса
 ObjectSetString(0,"=TrendLine",OBJPROP_TEXT,scale_mas[x]);}}    //выводим результат scale_mas[x]
Ieri ho scritto il codice, sembra funzionare come dovrebbe, ma solo quando arrivo al valore superiore dell'array con il pulsante più, si resetta all'inizio dell'array e si sposta di nuovo su per l'array. Cosa posso aggiungere o correggere nel codice, in modo che quando raggiunge il valore superiore dell'array, ulteriori clic sul pulsante più si fermino all'indice superiore e non si resettino al fondo dell'array? O il codice può essere semplificato in qualche altro modo per implementare l'idea del clic del pulsante?
 
Ivan Revedzhuk:
Ieri ho scritto il codice, sembra funzionare come dovrebbe, ma solo quando arrivo al valore superiore dell'array con il pulsante più, si resetta all'inizio dell'array e si sposta di nuovo su per l'array. Cosa posso aggiungere o correggere nel codice, in modo che quando raggiunge il valore superiore dell'array, ulteriori clic sul pulsante più si fermino all'indice superiore e non si resettino al fondo dell'array? O il codice può essere semplificato in qualche altro modo per implementare l'idea del clic del pulsante?
if(x >= ArraySize(scale_mas))
 ArraySize(scale_mas)-1;              //если х>= размер массива, то ....

Probabilmente è così.

 
Alexey Viktorov:

Credo di sì.

Provato anche questo, funziona allo stesso modo

 
Ivan Revedzhuk:

Provato anche questo, funziona allo stesso modo

Non l'ho notato subito, a cosa serve il ciclo?

 
Alexey Viktorov:

Non l'ho notato subito, ma a cosa serve il loop?

C'è un modo per farlo senza? Non so cosa sia meglio e faccio solo quello che penso sia logico.

 
Ivan Revedzhuk:

C'è un modo per farlo senza? Non so cosa sia meglio e faccio quello che penso sia logico.

Beh, la logica deve essere diversa. Premendo il pulsante + si aumenta l'indice della matrice. Raggiunto il massimo, non aumenta, ma rimane al massimo. Premuto il pulsante - l'indice è diminuito. Raggiunto lo zero, non reagisce alla pressione, rimane sull'indice 0.

O c'era qualche altra idea?

PS; E chi ha postato l'esempio di lavoro con le bandiere, in risposta a questa domanda e l'ha cancellato? Perché l'hai cancellato? Dopo tutto, è un'ottima soluzione per l'uomo. Perché avrebbe bisogno di una serie limitata?
 
Alexey Viktorov:

Beh, la logica deve essere diversa. Premendo il pulsante + si aumenta l'indice della matrice. Raggiunto il massimo, non aumenta, ma rimane al massimo. Premuto il pulsante - l'indice è diminuito. Raggiunto lo zero, non risponde, rimane all'indice 0.

O c'era qualche altra idea?

PS; E chi ha postato l'esempio di lavoro con le bandiere, in risposta a questa domanda e l'ha cancellato? Perché l'hai cancellato? Dopo tutto, è un'ottima soluzione per l'uomo. Perché avrebbe bisogno di una serie limitata?

No, l'idea era proprio quella. Non so davvero come farlo correttamente, quindi l'ho fatto come l'ho ottenuto. Ma ho notato che quando il ciclo è in esecuzione nel programma, finché non clicco i pulsanti sul grafico, tutto il resto non funziona. È come se tutto fosse in pausa. Non capisco perché questo accade, se ci sono delle varianti per implementare l'idea in qualche altro modo, ne sarei grato...

 

Questo è tutto. Il problema è risolto) senza array e altre cose. Si è rivelato molto più semplice))))

La seconda domanda è venuta fuori. Come posso impostare il livello di attivazione di Alert nel codice con la freccia di impostazione che appare quando Alert è impostato tramite il menu contestuale con il mouse?

Domanda sull'allarme

 

Per favore aiuto, plz, è possibile aggiungere una funzione a questo EA, in modo che l'EA impostato nella finestra EURUSD aprirà un accordo con gli stessi parametri, allo stesso tempo, ma per GBPUSD, e EURUSD non si aprirà.

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

//| Sviluppatore: Minaev Andrey |

//| Expert Advisor: Stocastico.mq4 |

|| Sito web: safe-forex.|| Sito web: safe-forex. |

//| Mail:minaev.work@mail.ru |

//| Skype: live:minaev.lavoro |

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

#proprietà copyright "Safe-Forex.ru"

#proprietà link "https://safe-forex.ru"

#proprietà rigorosa


extern bool Use_Symbol1 = true;

extern string Symbol1 = "USDJPY";


input string settings = ""; // impostazioni di Expert Advisor

input int magic = 111; // input magic

input double fixVolume = 0.01; // Volume

input int takeProfit = 500; // Profitto

input int stopLoss = 500; //Loss

input int buyLevel = 100; // input int buy Level

input int sellLevel = 0; // 75 Sell Level


extern int ADXperiod = 15; //ADX period 15

extern int ADXLevel =1;


extern int MAperiod =360; //periodo MA 80

extern int MAperiod_2 =360; //periodo MA 80



input string stochSettings = ""; // impostazioni dell'indicatore Stochastic Oscillator

input int stochPeriodK = 5; //periodo %K

input int stochPeriodD = 3; //periodo %D

input int stochSlowing = 3; // rallentamento

input ENUM_STO_PRICE stochPrice = STO_LOWHIGH; // Prezzo

input ENUM_MA_METHOD stochMethod = MODE_SMA; // Metodo


datetime newCandle; // nuova candela sul grafico corrente

bool allowOpenBuy; // permesso di aprire la posizione Buy

allowOpenSell; // permesso di aprire la posizione Sell

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

int OnInit(void)

{

ritorno INIT_SUCCEED;

}

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

void OnDeinit(const int reason)

{

}

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

void OnTick(void)

{

if(newCandle!=Time[0]) CheckSignalExist(); newCandle=Time[0];

if(allowOpenBuy) OpenPosition(OP_BUY);

se(allowOpenSell) OpenPosition(OP_SELL);

}

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

//| La funzione apre la posizione al prezzo corrente |

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

void OpenPosition(int type)

{


doppio prezzo=0,0;

if(type==OP_BUY) price=Ask;

if(type==OP_SELL) price=Bid;

int ticket=OrderSend(_Symbol,type,fixVolume,price,0,0,",magic,0);

// int ticket=OrderSend(,type,fixVolume,price,0,0,0,",magic,0);

Dormire(1000);

se(biglietto>0)

{

se(tipo==OP_BUY)

{

Print("Posizione di acquisto aperta, biglietto: ",biglietto);

allowOpenBuy=false;

// SetStopOrders(ticket);

}

se(tipo==OP_SELL)

{

Print("Posizione di vendita aperta, biglietto: ",biglietto);

allowOpenSell=false;

// SetStopOrders(ticket);

}

}

se(biglietto<0)

{

if(type==OP_BUY) Print("Buy position did not open, error: ",GetLastError());

if(type==OP_SELL) Print("Sell position didn't open, error: ",GetLastError());

}

}

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

//| La funzione imposta l'ordine di stop |

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

//evitare SetStopOrders(int ticket)

//{

// double stopLevel=MarketInfo(_Symbol,MODE_STOPLEVEL),

// spread =MarketInfo(_Symbol,MODE_SPREAD),

// tp =takeProfit,

// sl =stopLoss;

// stopLevel+=spread;

// se(tp<stopLevel)

// {

// tp=stopLevel;

// Print("Distanza minima per set di profitti");

// }

// se(sl<stopLevel)

// {

// sl=stopLevel;

// Print("Distanza minima per l'insieme delle perdite");

// }

// if(OrderSelect(ticket,SELECT_BY_TICKET))

// {

// int type=OrderType();

// double opp =OrderOpenPrice();

// if(type==OP_BUY) {tp=opp+tp*_Point; sl=opp-sl*_Point;}

// if(type==OP_SELL) {tp=topp-tp*_Point; sl=opp+sl*_Point;}

// if(OrderModify(ticket,opp,sl,tp,0))

// {

// if(type==OP_BUY) Print("P&L levels set for Buy position, ticket: ",ticket);

// if(type==OP_SELL) Print("I livelli P&L per la posizione Sell sono stati impostati, ticket: ",ticket);

// }

// else {

// if(type==OP_BUY) Print("I livelli P&L per la posizione Buy non sono stati impostati, ticket: ",ticket," error: ",GetLastError());

// if(type==OP_SELL) Print("I livelli P&L per la posizione Sell non sono stati impostati; ticket: ",ticket," error: ",GetLastError();

// }

// }

//}

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

//| La funzione controlla la presenza del segnale |

//+-------------------------------------------------------------------------------------------------------------------------------------------------+

void CheckSignalExist(void)


{

double ADX1=iADX(Symbol(),Period(),ADXperiod,0,MODE_MAIN,1); ////////////////////////////

double ADX2=iADX(Symbol(),Period(),ADXperiod,0,MODE_MAIN,2);

double DPLUS=iADX(Symbol(),Period(),ADXperiod,0,MODE_PLUSDI,1);

double DMINUS=iADX(Symbol(),Period(),ADXperiod,0,MODE_MINUSDI,1);

double MA=iMA(Symbol(),Period(),MAperiod,0,MODE_SMA,0,1);

double MA_2=iMA(Symbol(),Period(),MAperiod_2,0,MODE_SMA,0,1);


//PERIODO_H1

double mainLine1=iStochastic(_Symbol,PERIOD_CURRENT,stochPeriodK,stochPeriodD,stochSlowing,stochMethod,stochPrice,MODE_MAIN,1),

mainLine2=iStochastic(_Symbol,PERIOD_CURRENT,stochPeriodK,stochPeriodD,stochSlowing,stochMethod,stochPrice,MODE_MAIN,2),

signLine1=iStochastic(_Symbol,PERIOD_CURRENT,stochPeriodK,stochPeriodD,stochSlowing,stochMethod,stochPrice,MODE_SIGNAL,1),

signLine2=iStochastic(_Symbol,PERIOD_CURRENT,stochPeriodK,stochPeriodD,stochSlowing,stochMethod,stochPrice,MODE_SIGNAL,2);

Comment(" ", (Ask-Bid)/1.5," ",Bid-Close[1]," ", Ask-Close[1]);

// if(mainLine1>signLine1 && mainLine2<signLine2 && mainLine1<buyLevel && ADX1>ADXLevel && mainLine2<buyLevel

//& iClose(Symbol(),Period(),1)>MA& iClose(Symbol(),Period(),1)>MA_2 && signLine1<buyLevel && signLine2<buyLevel

if(mainLine1>signLine1 && mainLine2<signLine2 && mainLine1<buyLevel && ADX1>ADXLevel && mainLine2<buyLevel

//&Close[2]<MA& Close[2]<MA_2 && signLine1<buyLevel && signLine2<buyLevel

&&Close[10] > Close[1]-(Close[1]-Close[20])

&& Close[10]>Bid )

{

Print("È apparso un segnale per aprire una posizione di acquisto");

se(GetPositionsNumber()==0)

{

// allowOpenSell=true;

{ allowOpenBuy=true;

Dormire(1000);

Print("Permesso di aprire posizione di acquisto");

}

}

// if(mainLine1<signLine1 && mainLine2>signLine2 && mainLine1>sellLevel && ADX1>ADXLevel&& mainLine2>sellLevel

//& iClose(Symbol(),Period(),1)<MA& iClose(Symbol(),Period(),1)<MA_2 && signLine1>sellLevel && signLine2>sellLevel

if(mainLine1>signLine1 && mainLine2<signLine2 && mainLine1<buyLevel && ADX1>ADXLevel && mainLine2<buyLevel

//&Close[2]>MA& Close[2]>MA_2 && signLine1<buyLevel && signLine2<buyLevel

&&Close[10] < Close[1]+(Close[20]-Close[1])

&& Close[10]<Ask )

{

Print("È apparso un segnale per aprire una posizione di vendita");

se(GetPositionsNumber()==0)

{

// allowOpenBuy=true;

allowOpenSell=true;

Dormire(1000);

Print("Permesso di aprire la posizione Sell");

}

}

}
















/////////////////////////////////////////



//+-------------------------------------------------------------------------------------------------------------------------------------------------+

//| La funzione restituisce il numero di posizioni aperte |

//+-------------------------------------------------------------------------------------------------------------------------------------------------+







int GetPositionsNumber(void)

{

int numero=0;

for(int i=0; i<OrdersTotal(); i++)

if(OrderSelect(i,SELECT_BY_POS))

if(OrderSymbol()==_Symbol && OrderMagicNumber()==magico)

numero++;

numero di ritorno;

}

//+---------------------------------------------------------------------------------------------------------------------------------

 
vvs1:

Aiuto, plz, è possibile aggiungere una funzione a questo EA, in modo che l'EA installato nella finestra EURUSD apra un trade con gli stessi parametri di apertura, allo stesso tempo, ma su GBPUSD, e EURUSD non si apre.

Mi scusi, la sua testa è a posto? Non solo hai inserito il codice in un posto, ma hai anche lasciato un'enorme quantità di linee vuote.

Non pensi che dovresti avere un po' di rispetto per chi stai chiedendo aiuto?