Getting CLLocation course and translate to user - ios

I'm trying to get information about the direction taken by the user (N-S-W-O) via CLLocation's course method.
I'm using this code:
double course;
bool isNord;
course = currentLocation.course;
NSLog(#"Current course: %f", course);
NSInteger courseString = course;
//_labelCompass.text = [NSString stringWithFormat:#"%d", courseString];
if (courseString == -1) {
_labelCompass.text = #"N/A";
}
if (courseString >= 22 && courseString <= 67) {
isNord = false;
_labelCompass.text = #"NE";
}
if (courseString >=67 && courseString <= 112) {
isNord = false;
_labelCompass.text = #"E";
}
if (courseString >= 112 && courseString <= 157) {
isNord = false;
_labelCompass.text = #"SE";
}
if (courseString >= 157 && courseString <= 208) {
isNord = false;
_labelCompass.text = #"S";
}
if (courseString >= 208 && courseString <= 247) {
isNord = false;
_labelCompass.text = #"SW";
}
if (courseString >= 247 && courseString <= 292) {
isNord = false;
_labelCompass.text = #"W";
}
if (courseString >= 292 && courseString <= 337) {
isNord = false;
_labelCompass.text = #"NW";
}
if (isNord == true) {
_labelCompass.text = #"N";
}
Of course I'm putting this into
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
and the course information is update successfully.
Using this algorithm I cannot know when the course is North like I do for the others so I've built this.
There are any other methods better than this?
Thanks a lot.

The wrong thing is that with <= 67 of the first if and the second >= 67 of the second if, if the value is 67, ALWAYS the first if will be triggered.
Also, as stated by rmaddy please use else if, it's kind more efficent.
Finally use the best syntax min < myVal && myVal < max to emulate the Mathematical range min < MyVal < max.

Why can't you determine of the course is North? Just do:
if (course < 22 || course > 337) {
_labelCompass.text = #"N";
}
BTW - please use else if. It will be far more efficient:
if (courseString == -1) {
_labelCompass.text = #"N/A";
} else if (courseString >= 22 && courseString <= 67) {
_labelCompass.text = #"NE";
} else if (courseString >=67 && courseString <= 112) {

CLLocationManager has an heading option with an heading update Delegate.
- (void)locationManager:(CLLocationManager *)manager
didUpdateHeading:(CLHeading *)newHeading
newHeading has a property 'magneticHeading':
0 is north,
90 is east,
180 is south,
270 is west

Related

How do I correct my code to enable my Expect Advisor to take trades?

My EA was taking only 1 trade at a time on a single currency pair, it ignores the other pairs till the current trade is closed. I decided to modify it. Now it's no more trading at all.
int Hour = TimeHour(TimeCurrent());
int DayOfWeek = DayOfWeek();
int total = OrdersTotal();
int count=0;
for(int i=0; i<total; i++)
{
if(OrderSelect(i,SELECT_BY_POS) && OrderSymbol() == _Symbol && OrderMagicNumber()==MagicNumber)
{
Alert("Inside Order Select if");
// Checking if spread is less than 2.0 pips.
if(current_spread <= AllowableSpread)
{
// Checking for days of the week
if(DayOfWeek >= 1 && DayOfWeek <= 5)
{
// Checking for time of the day
if(Hour >= 3 && Hour <= 20)
{
if(ADXValue > 25)
{
if(RSIValue > 50 || RSIValue < 20)
{
if(PreviousFast<PreviousSlow && CurrentFast > CurrentSlow)
ticket = OrderSend(Symbol(), OP_BUY, LotSize, Ask, Slippage, Ask-(StopLoss*pips), Ask+(TakeProfit*pips), NULL, MagicNumber, 0, Green);
if(ticket<0)
Print("OrderSend failed with error #",GetLastError());
else
Print("OrderSend placed successfully");
}
if(RSIValue < 50 || RSIValue > 70)
{
if(PreviousFast>PreviousSlow && CurrentFast < CurrentSlow)
ticket = OrderSend(Symbol(), OP_SELL, LotSize, Bid, Slippage, Bid+(StopLoss*pips), Bid-(TakeProfit*pips), NULL, MagicNumber, 0, Red);
if(ticket<0)
Print("OrderSend failed with error #",GetLastError());
else
Print("OrderSend placed successfully");
}
}
}

MQL4 my first EA overtrades if I increase the amount of conditions it calculates

I have created an expert advisor that calculates some conditions and gives a value either long or short for each condition (+or- 0.1 lots), it then sums all the conditions to give a net long or short position.
It should then either open a new order or close an open one to alter the previous open positions(mlots) to match the target value the trade conditions have calculated(sum) on the change of each new bar; this is done by using the ontick function.
If I use only one or two conditions it works fine, but when I increase the number of conditions (sum can be greater than 0.2 lots or less than -0.2lots) it over trades by one and then closes the position which it should and then over trades by one again which it shouldn't get in to a nasty cycle.
I don't understand why it would work perfectly for two conditions but not for more than two I wonder if anyone has an idea I would be grateful for any input.
This is my first attempt at an EA any thoughts would be greatly appreciated best regards Ken
//+------------------------------------------------------------------+
//| test.mq4 |
//| Copyright 2018, K T |
//| https:// |
//+------------------------------------------------------------------+
#property copyright "Copyright 2018, K T"
#property link ""
#property version "1.00"
#property strict
#property description "SIMPLE TRADER"
//INPUT PARAMETERS
input double lots=0.1;
input int MagicNumber=1111;//MAGICNO MUST BE UNIQUE
input int condno=1; //1=3/10 10 2=10 10/20 3=ALL
input double test=0.0;
input int spread=1;
input int slippage=10;
input string simble="FTSE100(£)";
input int period=PERIOD_M1;
input double TP=200;
input double SL=100;
input int ma1input=3;
input int ma2input=10;
input int ma3input=20;
input int sleep=0;
//ONINIT TEST FOR CORRECR CONDITIONS
int OnInit()
{
string simble1=simble;
int period1=period;
if (simble1==Symbol()&& period1==Period() && Ask-Bid<=spread)
{
Alert ("CORRECT SYMBOL ", simble," mlots=", mlots(),"sum= ",sum());
Alert ("CORRECT TIME T", period);
return(INIT_SUCCEEDED);
}
else
{
Alert ("INIT FAILED");
Alert ("wrong symbol, time or spread too wide");
return(INIT_FAILED);
}
}
//ON EVERY TICK
void OnTick()
{
double sum1 = sum();
double mlots1 = mlots();
if(sum1 == mlots1)
{
neutral();
return;
}
else if(sum1>mlots1 && mlots1>=0 && mlots1!= sum1)
{
openbuy();
return;
}
else if(sum1>mlots1 && mlots1<0 && mlots1!= sum1)
{
closesell();
return;
}
else if(sum1<mlots1 && mlots1<=0 && mlots1!= sum1)
{
opensell();
return;
}
else if(sum1<mlots1 && mlots1>0 && mlots1!= sum1)
{
closebuy();
return;
}
else
return;
}
//NEUTRAL
void neutral()
{
Alert("T", period, " EQUILIBRIUM ", simble,"/ sum=",sum(),"/ mlots=" ,mlots());
return;
}
//OPEN BUY
void openbuy()
{
double TakeProfitLevel;
double StopLossLevel;
TakeProfitLevel = Bid + TP*Point*10; //0.00001 * 10 = 0.0001
StopLossLevel = Bid - SL*Point*10;
if(mlots()!= sum())
{
OrderSend(simble, OP_BUY, lots, Ask, slippage*10, StopLossLevel, TakeProfitLevel, "BUY", MagicNumber);//notice that slippage also has to be multiplied by 10
Alert(MagicNumber," T", period, " OPENBUYFCTION = ", simble,"/ sum=",sum(),"/ mlots=" ,mlots());
Sleep(sleep);
return;
}
else
{
return;
}
}
//OPEN SELL
void opensell()
{
double TakeProfitLevel;
double StopLossLevel;
//here we are assuming that the TakeProfit and StopLoss are entered in Pips
TakeProfitLevel = Ask - TP*Point*10; //0.00001 * 10 = 0.0001
StopLossLevel = Ask + SL*Point*10;
if (mlots()!= sum())
{
OrderSend(simble, OP_SELL, lots, Bid, slippage*10, StopLossLevel, TakeProfitLevel, "SELL", MagicNumber); //notice that slippage also has to be multiplied by 10
Alert(MagicNumber," T", period, " OPENSELLFCTION = ", simble,"/ sum=",sum(),"/ mlots=" ,mlots());
Sleep(sleep);
return;
}
else
{
return;
}
}
//CLOSE BUY
void closebuy()
{
if(mlots()==sum())
{
neutral();
return;
}
int low=OrderTicket();
int i=OrdersTotal();
for (i = OrdersTotal(); i >=0; i--)
{
if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
if (i<=OrdersTotal() && OrderType()== OP_BUY && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber )
bool closed = OrderClose( low, OrderLots(), Bid, slippage, White);
Alert("Ticket= ", low);
Alert(MagicNumber," T", period, " CLOSEBUYFCTION = ", simble,"/ sum=",sum(),"/ mlots=" ,mlots());
Sleep(sleep);
return;
}
}
//CLOSE SELL
void closesell()
{
if(mlots()==sum())neutral();
int low=OrderTicket();
int i=OrdersTotal();
for (i = OrdersTotal(); i >=0; i--)
{
if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
if (i<=OrdersTotal() && OrderType()== OP_SELL && OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber )
bool closed = OrderClose( low, OrderLots(), Ask, slippage, White);
Alert("Ticket= ", low);
Alert(MagicNumber," T", period, " CLOSESELLFCTION = ", simble,"/ sum=",sum(),"/ mlots=" ,mlots());
Sleep(sleep);
return;
}
}
//CONDITION 1
double cond1() //cond 1 3ema 10ma
{
double ma1;
double ma2;
ma1=iMA(NULL,0,ma1input,0,MODE_EMA,PRICE_CLOSE,1);//3EMA
ma2=iMA(NULL,0,ma2input,0,MODE_SMA,PRICE_CLOSE,1);//10MA
if(ma1>=ma2)
{
return(lots);
}
else
{
return(lots*-1);
}
}
//CONDITION 2
double cond2() //cond 2 10ema 10ma
{
double ma1;
double ma2;
ma1=iMA(NULL,0,ma1input,0,MODE_EMA,PRICE_CLOSE,1);//3EMA
ma2=iMA(NULL,0,ma2input,0,MODE_EMA,PRICE_CLOSE,1);//10EMA
if(ma1>=ma2)
{
return(lots);
}
else
{
return(lots*-1);
}
}
//CONDITION 3
double cond3() //cond 3 10ema 20ema
{
double ma1;
double ma2;
ma1=iMA(NULL,0,ma2input,0,MODE_EMA,PRICE_CLOSE,1);//10EMA
ma2=iMA(NULL,0,ma3input,0,MODE_EMA,PRICE_CLOSE,1);//20EMA
if(ma1>=ma2)
{
return(lots);
}
else
{
return(lots*-1);
}
}
//CONDITION 4
double cond4() //cond 4 10ma 20Ema
{
double ma1;
double ma2;
ma1=iMA(NULL,0,ma2input,0,MODE_SMA,PRICE_CLOSE,1);//10MA
ma2=iMA(NULL,0,ma3input,0,MODE_EMA,PRICE_CLOSE,1);//20EMA
if(ma1>=ma2)
{
return(lots);
}
else
{
return(lots*-1);
}
}
//SELECTING CONDITIONS TO BE INCLUDED
double sum()
{
if(condno==1)
{
return(cond1() + cond2());
}
else if(condno==2)
{
return(cond3() + cond4());
}
else if (condno==3)
{
return(cond1() + cond2()+ cond3() + cond4() );//IF MORE THAN TWO CONDITIONS USED IT OVERTRADES B ONE AND THEN CLOSES ERROR TRADE
}
else
return(cond1() + cond2());
}
//COUNT OF ALL OPEN TRADES
double mlots()
{
double mlots1 = BuyTotalMagicOpen() + SellTotalMagicOpen();
double mlots2 = mlots1/10;
return (mlots2);
}
//COUNT BUY ORDERS
double BuyTotalMagicOpen()
{
int OrderCount = 0;
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
if (OrderType() == OP_BUY) OrderCount++;
}
return (OrderCount);
}
//COUNT SELL ORDERS
double SellTotalMagicOpen()
{
int OrderCount = 0;
for (int i = OrdersTotal() - 1; i >= 0; i--)
{
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
if (OrderSymbol() != Symbol() || OrderMagicNumber() != MagicNumber) continue;
if (OrderSymbol() == Symbol() && OrderMagicNumber() == MagicNumber)
if (OrderType() == OP_SELL) OrderCount++;
}
return (OrderCount*-1);
}
//CLOSE ALL MAGICNUMBER REFRESHRATES BUSYSLEEP MODE
void CloseThis() {
for (int i = OrdersTotal(); i >=0; i--) {
OrderSelect(i, SELECT_BY_POS, MODE_TRADES);
while(IsTradeContextBusy()) Sleep(100);
RefreshRates();
if (OrderType() == OP_BUY && Symbol() == OrderSymbol()
&& MagicNumber == OrderMagicNumber()) {
bool closed = OrderClose( OrderTicket(), OrderLots(), Bid, slippage, Red);
Alert("T", period, " BUY CLOSED ON DEINIT");
}
if (OrderType() == OP_SELL && Symbol() == OrderSymbol()
&& MagicNumber == OrderMagicNumber()) {
bool closed = OrderClose( OrderTicket(), OrderLots(), Ask, slippage, Green);
Alert("T", period, " SELL CLOSED ON DEINIT");
}
}
}
//DEINIT
void OnDeinit(const int reason)//MAGIC NO
{
CloseThis();
Alert("T", period, " DEINIT SUCCEEDED");
}
//

Is there a method to calculate the total duration a gif plays?

I want to calculate the total duration a gif plays. It can be either duration of a gif or frame count of the gif. Have tried using FLAnimatedImage, SDWebImage and YYImage but can't really attain what I am looking for. The gif is loaded from remote url and then I want to calculate the duration it plays.
This is the function that returns the total duration in GIF time units (1 unit = 10 msec).
data is a pointer to GIF data, size is its size.
long Duration(uint8_t *data, long size) {
long desc, time = 0;
uint8_t *buff;
if ((size > 13) && data && (data[0] == 71) && (data[1] == 73)
&& (data[2] == 70) && (data[3] == 56) && (data[5] == 97)
&& ((data[4] == 55) || (data[4] == 57))) {
buff = data + 13 + ((data[10] & 0x80)? 6 << (data[10] & 7) : 0);
if ((size -= buff - data) > 0)
while ((desc = *buff++) != 0x3B) {
size--;
if (desc == 0x2C) {
desc = 9 + ((buff[8] & 0x80)? 6 << (buff[8] & 7) : 0);
buff += desc;
if ((size -= desc) <= 0)
break;
}
else if ((desc == 0x21) && (*buff == 0xF9))
time += *(uint16_t*)(buff + 3);
buff++;
if (--size <= 0)
break;
do {
buff += (desc = 1 + *buff);
if ((size -= desc) <= 0)
return time;
} while (desc > 1);
}
}
return time;
}
This function parses GIF images by hand, extracting frame delay information and summing it.

how do i calculate user inputs in form?

i have a rails app with user inputs, i have to perform a calculation and store its new value. eg of price is given which was earlier written in js and php
if(count($_POST['price']) >= 0 && !empty($_POST['price']))
{
$price = $_POST['price'];
$sql .= " '". $price ."', ";
switch ($price){
case ($price >= 0 && $price <= 21):
$price_rating = 0;
break;
case ($price >= 22 && $price <= 29):
$price_rating = 5;
break;
case ($price >= 30 && $price <= 39):
$price_rating = 7;
break;
case ($price >= 40 && $price <= 49):
$price_rating = 8;
break;
case ($price >= 50 && $price <= 59):
$price_rating = 6;
break;
default:
$price_rating = 0;
}
}
else
{
$price_rating = 0;
$sql .= " '', ";
}
everything is the same... in the according controller you just need to do
#price = params[:price] (which is the same as $price = $_POST['price'];)
if (0..21).include?(#price)
#price_rating = 0
if ... and so on

Logical operators and wrong result in Objective C

I got the x and y by a UITapGestureRecognizer set on the screen, after having obtained the location I find the object touched, so I put the conditions, but does not work. Maybe I put the wrong conditions in objective C? Xcode gives no errors but the function does not work.
-(void)tappedMapOniPad:(int)x andy:(int)y{
NSLog(#"the x is: %d", x);
//the x is: 302
NSLog(#"the y is: %d", y);
//the y is: 37
if((121<x<=181) && (8<y<=51)){ //the error is here
self.stand = 431;
}else if ((181<x<=257) && (8<y<=51)){
self.stand=430;
}else if ((257<x<=330) && (8<y<=51)){
self.stand = 429;
}
NSLog(#"The stand is %d", self.stand);
//The stand is 431
}
How can I do?
121<x<=181
let's assume x := 10 121<10<=181 -> false<=181 -> 0<=181 -> true
you have to do it step by step.
((121 < x) && (x <=181))
let's assume x := 10 ((121 < 10) && (10 <=181)) ->false && true ->false
Replace
if((121<x<=181) && (8<y<=51))
by
if((121 < x && x <= 181) && (8 < y && y <= 51))
(121<x<=181) kind of expression is invalid in Obj-c.
Use, (x>121 && x<=181)
Your full code will be like :
if((x>121 && x<=181) && (y>8 && y<=51)){ //the error is here
self.stand = 431;
}
else if ((x>181 && x<=257) && (y>8 && y<=51)){
self.stand=430;
}
else if ((x> 255 && x<=330) && (y>8 && y<=51)){
self.stand = 429;
}
Or you can optimize it as:
if(y>8 && y<=51){
if (x> 257 && x<=330) {
self.stand = 429;
}
else if(x>181){
self.stand=430;
}
else if(x>121){
self.stand = 431;
}
}
Missing &&
Try
if((121<x&&x <=181)&&(8<y&&y <=51))
Hope it helps

Resources